我有一个数据集,其中包含一个具有以下模式的列:
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