如何有效地左加入Spark



我有两个表—一个包含所有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_tablealldata_table之间的左连接被证明是昂贵的。我应该

  • 在sql中完全如上所述操作,然后提取结果作为数据帧?
  • 创建interesting_tablealldata_table作为数据帧,并使用。join()操作符?
  • 创建interesting_tablealldata_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字段,使其更小。

相关内容

  • 没有找到相关文章

最新更新