java - Spark将数组列爆炸到列
问题描述
我正在将 Spark 与 Java 一起使用,并且我有一个这样的数据框:
id | array_column
-------------------
12 | [a:123, b:125, c:456]
13 | [a:443, b:225, c:126]
我想用相同的 id 分解 array_column,但这explode
还不够,因为我希望数据框是:
id | a | b | c
-------------------
12 |123 |125 | 456
13 |443 |225 | 126
因此,在这种情况下,正常explode
开启array_column
效果不佳。
我很乐意为您提供帮助,谢谢!
解决方案
以下方法适用于array_column
. 该方法用于在将每个字符串元素拆分为两个不同的列之前分别explode
扩展字符串元素列表。最后,pivot 与 group by 一起使用,将数据转置为所需的格式。array_column
:
col_name
col_val
以下示例使用 pyspark api,但可以轻松转换为 java/scala api,因为它们相似。我假设您的数据集位于名为input_df
from pyspark.sql import functions as F
output_df = (
input_df.select("id",F.explode("array_column").alias("acol"))
.select(
"id",
F.split("acol",":")[0].alias("col_name"),
F.split("acol",":")[1].cast("integer").alias("col_val")
)
.groupBy("id")
.pivot("col_name")
.max("col_val")
)
让我知道这是否适合您。
推荐阅读
- html - 活动时元素变换(半按)
- flutter - 更改 ThemeData.dark() 的一个属性
- javascript - 获取表格中的位置
- mysql - 什么可能导致 MySQL 间歇性地无法返回一行?
- ruby-on-rails - 使用自定义脚手架路由时未定义的局部变量或方法
- iperf - 如何在 iperf 命令发送的数据包中嵌入自定义标头?
- checkbox - 选中复选框时将行移动到完全不同的电子表格
- c++ - 在 C++ 程序中嵌入 Perl 脚本
- jenkins - Liquibase 安装
in 不是有效的 Liquibase 安装 - python - Pandas 数据框读取 csv 给出了值中的隐藏字符