【问题标题】:Convert Array with nested struct to string column along with other columns from the PySpark DataFrame将具有嵌套结构的数组与 PySpark DataFrame 中的其他列一起转换为字符串列
【发布时间】:2019-03-15 08:35:00
【问题描述】:

这类似于Pyspark: cast array with nested struct to string

但是,接受的答案不适用于我的情况,所以在这里问

|-- Col1: string (nullable = true)
|-- Col2: array (nullable = true)
    |-- element: struct (containsNull = true)
          |-- Col2Sub: string (nullable = true)

示例 JSON

{"Col1":"abc123","Col2":[{"Col2Sub":"foo"},{"Col2Sub":"bar"}]}

这会在单个列中给出结果

import pyspark.sql.functions as F
df.selectExpr("EXPLODE(Col2) AS structCol").select(F.expr("concat_ws(',', structCol.*)").alias("Col2_concated")).show()
    +----------------+
    | Col2_concated  |
    +----------------+
    |foo,bar         |
    +----------------+

但是,如何获得这样的结果或 DataFrame

+-------+---------------+
|Col1   | Col2_concated |
+-------+---------------+
|abc123 |foo,bar        |
+-------+---------------+

编辑: 这个解决方案给出了错误的结果

df.selectExpr("Col1","EXPLODE(Col2) AS structCol").select("Col1", F.expr("concat_ws(',', structCol.*)").alias("Col2_concated")).show() 


+-------+---------------+
|Col1   | Col2_concated |
+-------+---------------+
|abc123 |foo            |
+-------+---------------+
|abc123 |bar            |
+-------+---------------+

【问题讨论】:

  • 你可以选择"Col1",虽然它不是表达式 df.selectExpr("Col1","EXPLODE(Col2) AS structCol").select("Col1", F.expr("concat_ws (',', structCol.*)").alias("Col2_concated")).show()
  • 对不起,这个不行,我在问题里加了原因

标签: pyspark pyspark-sql


【解决方案1】:

只要避免爆炸,你就已经在那里了。您所需要的只是concat_ws 函数。此函数使用给定的分隔符连接多个字符串列。请参阅下面的示例:

from pyspark.sql import functions as F
j = '{"Col1":"abc123","Col2":[{"Col2Sub":"foo"},{"Col2Sub":"bar"}]}'
df = spark.read.json(sc.parallelize([j]))

#printSchema tells us the column names we can use with concat_ws                                                                              
df.printSchema()

输出:

root
 |-- Col1: string (nullable = true)
 |-- Col2: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- Col2Sub: string (nullable = true)

Col2 列是 Col2Sub 的数组,我们可以使用该列名来获得所需的结果:

bla = df.withColumn('Col2', F.concat_ws(',', df.Col2.Col2Sub))

bla.show()
+------+-------+                                                                
|  Col1|   Col2|
+------+-------+
|abc123|foo,bar|
+------+-------+

【讨论】:

  • 谢谢!你是救命稻草 :)
猜你喜欢
  • 2017-09-06
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多