spark中两份很大的数据如何能避免join时的shuffle

目的:在spark中有两份很大的数据需要join,两份输入数据都含有userid这个字段,现在需要根据userid关联,我希望能避免shuffle。

已完成:我预先对两份数据根据userid各自处理成1w个文件,这样能保证相同userid的数据落到相同分区编号,同时,每个分区内的文件根据userid排序。

比如第一个文件数据为

{'userid': 10001, 'value': ''}
{'userid': 1, 'value': ''}
{'userid': 21, 'value': ''}

第二个文件的数据为

{'userid': 10001, 'value': ''}
{'userid': 1, 'value': ''}
{'userid': 92, 'value': ''}

第一个文件处理后的格式为:
file1/part-00001

{'userid': 1, 'value': ''}
{'userid': 10001, 'value': ''}

file1/part-00021

{'userid': 21, 'value': ''}

第二个文件处理后的格式为:
file2/part-00001

{'userid': 1, 'value': ''}
{'userid': 10001, 'value': ''}

file2/part-00092

{'userid': 92, 'value': ''}

遇到的问题:在spark中,怎么能让相同分区编号的的两个文件落到一个任务上去处理,而且我需要能操作到两个分区文件,因为两个分区都是根据userid排序的,我只要o(n+m)的时间复杂度就可以完成关联操作。

如果做不到操作两个分区文件,可以做到两个相同分区编号的文件合并到一个任务上去处理吗?只是这样的话,我需要在分区内再做一次额外的排序。

阅读 5.4k
1 个回答

如果两边的文件中 userid 分别都是唯一的,这种情况可以把两份数据 union 到一起之后再做 reduce ,性能会好很多。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进