apache-spark - 如何根据 Apache Spark 中的分隔符将单个字符串列转换为多列
问题描述
我有一个带有字符串列的数据框,我想从中创建多个列。
这是我的输入数据,pagename
是我的字符串列
我想从中创建多个列。字符串的格式相同 - col1:value1 col2:value2 col3:value3 ... colN:valueN
。在输出中,我需要多列 -col1 to colN
每列的值作为行。这是输出 -
我怎样才能在火花中做到这一点?Scala 或 Python 都适合我。下面的代码创建输入数据框 -
scala> val df = spark.sql(s"""select 1 as id, "a:100 b:500 c:200" as pagename union select 2 as id, "a:101 b:501 c:201" as pagename """)
df: org.apache.spark.sql.DataFrame = [id: int, pagename: string]
scala> df.show(false)
+---+-----------------+
|id |pagename |
+---+-----------------+
|2 |a:101 b:501 c:201|
|1 |a:100 b:500 c:200|
+---+-----------------+
scala> df.printSchema
root
|-- id: integer (nullable = false)
|-- pagename: string (nullable = false)
注意 - 该示例在此处仅显示 3 列,但总的来说,我希望处理 100 多个列。
解决方案
您可以使用str_to_map
, 分解生成的地图和枢轴:
val df2 = df.select(
col("id"),
expr("explode(str_to_map(pagename, ' ', ':'))")
).groupBy("id").pivot("key").agg(first("value"))
df2.show
+---+---+---+---+
| id| a| b| c|
+---+---+---+---+
| 1|100|500|200|
| 2|101|501|201|
+---+---+---+---+
推荐阅读
- jakarta-ee - Eclipse Microprofile 和 Jakarta EE 9
- c - 为什么 printf 不使用字符串在 c 中打印任何内容?
- python - 机器学习 Sololearn 关于 Coulmn 数据等的 Coach 问题
- c++ - 无法理解 OBS-Studio 源代码中的 typedef 指针函数声明
- vbscript - 经典 ASP 解码
- python - 我无法使用脚本登录
- node.js - 将多个范围 (ACL) 中间件传递给路由只是测试第一个范围
- java - 找不到方法错误的实现方法
- blazor - Blazor 声称传输用户名 var 的问题
- reactjs - ReactJS 应用程序不断被部署到 Heroku,使用开发版本而不是生产版本