我有两个表—一个包含所有user_id及其属性,另一个只包含有趣的user_id及其属性。我想查询它们,为机器学习问题创建一个训练集。
在纯SQL中,我将这样做:select label, user_id, feature
from (
select 1 as label, user_id, feature
from interesting_table
UNION ALL
select 0 as label, a.user_id, a.feature
from alldata_table a
left join
interesting table b
on a.user_id = b.user_id
where b.user_id is null
)
在Spark中,从interesting_table
提取很容易,但interesting_table
和alldata_table
之间的左连接被证明是昂贵的。我应该
- 在sql中完全如上所述操作,然后提取结果作为数据帧?
- 创建
interesting_table
和alldata_table
作为数据帧,并使用。join()操作符? - 创建
interesting_table
和alldata_table
作为数据帧,通过否定'.isin()'获得interesting_df.user_id
和子集alldata_df.user_id
的唯一成员? - 别的吗?
我不确定这是最好的答案,但我最终使用了带有广播的数据帧API。
alldata_table = spark.table('alldata_table')
interesting_table = spark.table('interesting_table')
interesting_table.withColumnRenamed('user_id','user_id_interesting')
new_table = alldata_table.join(broadcast(interesting_table),
cond=[alldata_table['user_id']==interesting_table['user_id_interesting']],
how='left_outer')
new_table.filter(new_table['user_id_interesting'].isnull())
当然,这假设interesting_table
足够小,可以广播。据推测,它可以减少到只有user_id
字段,使其更小。