如何使用pyspark将列类型从“array”更改为“string”?

rqqzpn5f  于 2021-05-17  发布在  Spark
关注(0)|答案(1)|浏览(743)

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

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

可以看到第二列, payload ,包含字典列表作为其条目。我想将此列的类型从 arraystring 我尝试了以下代码,正如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
iyr7buue

iyr7buue1#

将内部Map键、值数据转换为字符串数组,然后将数据展平并将结果传递给 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

相关问题