首页 > 解决方案 > 将列从一个数据帧添加到另一个不加入

问题描述

在这里参考谁建议加入将列从一个表附加到另一个表。我确实一直在使用这种方法,但现在对巨大的表和行列表有一些限制

假设我有一个包含 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 也会将它们分发以进行存储,并且检索(如果我想查询回追加)并不能保证具有相同的顺序。

标签: pythonapache-sparkdataframejoinpyspark

解决方案


除了“加入”之外,似乎没有火花函数可以将列从一个 DF 直接附加到另一个。

如果您仅从一个数据框开始并尝试从数据框的每个原始列生成新特征。我建议使用“pandas_udf”,其中新功能可以附加到所有原始列的“udf”中。

这将完全避免使用“加入”。要控制内存使用,请选择“组”列,我们确保每个组都在执行程序内存规范内。


推荐阅读