apache-spark - 将每条记录转置为 pyspark 数据框中的多列
问题描述
我希望将每条记录转换为 pyspark 数据框中的多列。
这是我的数据框:
+--------+-------------+--------------+------------+------+
|level_1 |level_2 |level_3 |level_4 |UNQ_ID|
+--------+-------------+--------------+------------+------+
|D Group|Investments |ORB |ECM |1 |
|E Group|Investment |Origination |Execution |2 |
+--------+-------------+--------------+------------+------+
所需的数据框是:
+--------+---------------+------+
|level |name |UNQ_ID|
+--------+---------------+------+
|level_1 |D Group |1 |
|level_1 |E Group |2 |
|level_2 |Investments |1 |
|level_2 |Investment |2 |
|level_3 |ORB |1 |
|level_3 |Origination |2 |
|level_4 |ECM |1 |
|level_4 |Execution |2 |
+--------+---------------+------+
解决方案
使用堆栈函数的更简单方法:
import pyspark.sql.functions as f
output_df = df.selectExpr('stack(4, "level_1", level_1, "level_2", level_2, "level_3", level_3, "level_4", level_4) as (level, name)', 'UNQ_ID')
output_df.show()
# +-------+-----------+------+
# | level| name|UNQ_ID|
# +-------+-----------+------+
# |level_1| D Group| 1|
# |level_2|Investments| 1|
# |level_3| ORB| 1|
# |level_4| ECM| 1|
# |level_1| E Group| 2|
# |level_2|Investments| 2|
# |level_3|Origination| 2|
# |level_4| Execution| 2|
# +-------+-----------+------+
推荐阅读
- xml - 使元素的内容在 xsd 中唯一
- imageview - Android ImageView @drawable 选项没有出现
- python - 位置已被占用的时间的数据结构,可以快速更改这些时间
- python - 一个列表理解中的多个函数取决于条件
- angular - Angular FormArray 清除字段中的数据
- python-3.x - 具有非零初始条件的 Python3 ode 求解器失败
- python - 来自 to_datetime() 的奇怪行为
- tensorflow - TensorFlow 中的可微分性是什么?
- linux - 如何使用 tar 计算具有排除项的目录的哈希值
- java - 在 j_security 表单的另一侧调用用户名?