首页 > 解决方案 > 如何根据 Apache Spark 中的分隔符将单个字符串列转换为多列

问题描述

我有一个带有字符串列的数据框,我想从中创建多个列。

这是我的输入数据,pagename是我的字符串列

1

我想从中创建多个列。字符串的格式相同 - col1:value1 col2:value2 col3:value3 ... colN:valueN。在输出中,我需要多列 -col1 to colN每列的值作为行。这是输出 -

2

我怎样才能在火花中做到这一点?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 多个列。

标签: apache-sparkpysparkapache-spark-sql

解决方案


您可以使用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|
+---+---+---+---+

推荐阅读