如何使用 Pyspark 将列类型从 "Array" 更改为"String"?



我有一个数据集,其中包含一个具有以下模式的列:

root
|-- id_: string (nullable = true)
|-- payload: array (nullable = true)
|    |-- element: map (containsNull = true)
|    |    |-- key: string
|    |    |-- value: string (valueContainsNull = true)

其中可以看出,第二列payload包含字典列表作为其条目。我想将此列的类型从array更改为string,并尝试了以下代码,如https://sparkbyexamples.com/pyspark/pyspark-convert-array-column-to-string-column/:

df = df.withColumn("payload", concat_ws(",",col("payload")))

但是,我遇到了一个意外错误(见下文(。我认为这是因为每个列条目中包含的列表存储字典。有人知道如何解决这个问题吗?

argument 2 requires (array<string> or string) type, however,`payload` is of array<map<string,string>> type.;

非常感谢,

马里安萨斯

在@SRINIVAS建议的解决方案之后编辑:我得到以下错误。

Syntax Error.
File "unnamed_3", line 7
df.withColumn("payload", F.expr(concat_ws(',',flatten(transform(payload,x -> transform(map_keys(x),y -> concat(y,x[y])))))))
         ^
SyntaxError: invalid syntax

将内部映射键、值数据转换为字符串数组,然后压平数据并将结果传递给concat_ws函数。

检查以下代码。

df.printSchema
root
|-- id_: string (nullable = true)
|-- payload: array (nullable = true)
|    |-- element: map (containsNull = true)
|    |    |-- key: string
|    |    |-- value: string (valueContainsNull = true)
df.show()
+----+----------------+
|id_ |payload         |
+----+----------------+
|id_a|[[a -> a value]]|
|id_b|[[b -> b value]]|
|id_c|[[c -> c value]]|
+----+----------------+
df
.withColumn(
"payload",
F.expr("concat_ws(',',flatten(transform(payload,x -> transform(map_keys(x),y -> concat(y,x[y])))))")
).show()
+----+--------+
|id_ |payload |
+----+--------+
|id_a|aa value|
|id_b|bb value|
|id_c|cc value|
+----+--------+

Spark版本-2.4

最新更新