在没有联接的情况下将列从一个数据框添加到另一个数据

时间:2019-04-12 17:19:52

标签: python apache-spark dataframe join pyspark

请参考here,他建议使用Join将列从一个表追加到另一个表。我确实一直在使用这种方法,但是现在对于巨大的表和行列表达到了一定的限制

假设我有一个包含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异常的内存限制。提高执行程序和驱动程序的内存似乎只是一个临时解决方案,受管理员的限制。

JOIN昂贵且受pyspark中资源的限制,我想知道是否有可能单独对每个功能表进行预排序,然后保持该顺序而仅 APPEND 将整列彼此相邻,而不是执行昂贵的JOIN。我可以为每个功能表保留所有相同的行列表。我希望没有加入或查找,因为我的ID集合是相同的。

这是如何实现的?据我了解,即使我按ID对每个表进行排序,Spark也会将它们分配用于存储,并且检索(如果我想查询回追加)并不保证具有相同的顺序。

1 个答案:

答案 0 :(得分:0)

除了“join”之外,似乎没有将列从一个 DF 直接附加到另一个的 spark 函数。

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

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