【发布时间】:2018-04-19 08:58:49
【问题描述】:
我有两个 Spark 数据框 DFa 和 DFb,它们具有相同的架构('country'、'id'、'price'、'name')。
- DFa 有大约 6.1 亿行,
- DFb 有 30 亿行。
现在我想从 DFa 和 DFb 中找到所有具有相同 id 的行,其中 id 看起来像“A6195A55-ACB4-48DD-9E57-5EAF6A056C80”。
这是一个 SQL 内连接,但是当我运行 Spark SQL 内连接时,一个任务被杀死,因为容器使用了太多内存并导致 Java 堆内存错误。而我的集群资源有限,调优YARN和Spark配置不是一个可行的方法。
还有其他解决方案可以解决这个问题吗?如果运行时可以接受,不使用 spark 解决方案也是可以接受的。
更一般地说,在两个非常大的数据集中找到共同元素时,谁能给出一些算法和解决方案。
【问题讨论】:
-
连接两个数据集(可能只有ID)并通过分组提取具有相同ID的数据集是否可以接受?
-
一个数据库,两张表,使用id作为主键,获取DFb的最小和最大id范围,一个动态查询,获取DFb的id范围集并与DFa进行比较,然后插入第三张表.编写一个 Java 方法以合理的长度遍历 id 范围,每次迭代后关闭/重新打开数据库连接以释放资源。
-
我不知道 spark,但是一个很好的通用方法是根据 ID 的哈希将记录分区到存储桶中,然后在每个存储桶中独立地进行联接。
-
当数据库崩溃时,我很幸运能将这种大小的数据集提取到文件中,然后使用 unix 排序实用程序将匹配的 ID 放在一起,然后按顺序处理。就像@ChatterOne 推荐的那样。
标签: algorithm apache-spark bigdata