在这里参考谁建议加入将列从一个表附加到另一个表。我确实一直在使用这种方法,但现在对巨大的表和行列表有一些限制
假设我有一个包含 M 个特征的数据框id, salary, age, etc.
+----+--------+------------+--------------+
| id | salary | age | zone | ....
+----+--------+------------+--------------+
我已经对每个功能执行了某些操作以达到这样的效果
+----+--------+------------+--------------+------------+--------------+--------------+--------------+
| id | salary | bin_salary | start_salary | end_salary | count_salary | stat1_salary | stat2_slaary |
+----+--------+------------+--------------+------------+--------------+--------------+--------------+
每个特征都是独立处理的,具有相同的行列表
+----+--------+------------+--------------+------------+
| id | salary | stat1_salary | stat2_salary | stat3_salary|
+----+--------+------------+--------------+------------+
| 301 | x1 | x | x | x |
| 302 | null | x | x | x |
| 303 | x3 | x | x | x |
+----+--------+------------+--------------+
| id | age | stat1_age | stat2_age
+----+--------+------------+--------------+
| 301 | null | x | x
| 302 | x2 | x | x
| 303 | x3 | x | x
最后,我想将它们组合成具有每个特征的所有属性的最终数据框,方法是加入有效的数百到数千个表的唯一 ID,每个表对应一个特征。这个最终的数据框是我的特征向量
| id | salary | stat1_salary | stat2_salary | stat3_salary| age | stat1_age | stat2_age
我遇到了一些导致Out Of Memory
异常的内存限制。提高 executor 和 driver 内存似乎只是一个临时解决方案,并且受到管理员的限制。
JOIN 很昂贵,并且受 pyspark 中的资源限制,我想知道是否可以独立地对每个特征表进行预排序,然后保持该顺序并将整个列彼此相邻,而不是执行昂贵的 JOIN。我可以设法为每个特征表保留所有相同的行列表。我希望没有加入或查找,因为我的 Id 集是相同的。
它是如何实现的?据我了解,即使我按 Id 对每个表进行排序,Spark 也会将它们分发以进行存储,并且检索(如果我想查询回追加)并不能保证具有相同的顺序。