开发者社区> 问答> 正文

在不平衡数据集的情况下加入优化

我有两套LEFT加入:

数据集A:~10000个parquet文件,每个300 KB

数据集B:每个30 MB的~50000个parquet文件

我想加入一个在两个数据集中都很常见的字符串列,比如说“name”。

一个重要的事情是数据集A中的每一行都在数据集B中匹配。但是数据集B包含许多其他行。

通常的连接函数需要很长时间并且在大多数情况下都会失败 所以我问是否可以进行优化?例如,在“名称”列上按字母顺序划分数据集B是一个好主意吗?广播连接不起作用,因为数据集A不够小。

展开
收起
社区小助手 2018-12-11 17:28:18 1460 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    如果您可以在加入之前对文件进行bucketize,它可能会更好。否则,您还需要一个写入步骤来使用存储。

    df_A.write.format('parquet')
    ... .bucketBy(10, 'name')
    ... .mode("overwrite")
    ... .saveAsTable('bucketed_table_A'))

    df_B.write.format('parquet')
    ... .bucketBy(10, 'name')
    ... .mode("overwrite")
    ... .saveAsTable('bucketed_table_B'))
    Bucketing允许您预先随机播放数据。dataframa_A和datafram_B都应具有相同数量的存储桶。存储桶数量的选择是一项困难的“艺术”,取决于您的数据和配置。

    然后,你阅读你的bucketized数据,然后你加入“名称”。

    spark.table('bucketed_table_A').join(

    spark.table('bucketed_table_B'),
    on='name',
    how='left'

    )
    这样做,您将计算时间从连接步骤转移到写入/ bucketize步骤。但是做一次,然后你可以多次重复使用它。

    2019-07-17 23:19:56
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
展心展力MetaApp:基于DeepRec的稀疏模型训练实践 立即下载
《DeepRec:大规模稀疏模型训练引擎》 立即下载
基于Spark的面向十亿级别特征的大规模机器学习 立即下载