【问题标题】:How to change a column type from "Array" to "String" with Pyspark?如何使用 Pyspark 将列类型从“数组”更改为“字符串”?
【发布时间】:2021-02-27 16:53:03
【问题描述】:

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

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

【问题讨论】:

  • F.expr("..") 将采用 string 类型的参数,正确的一个 - F.expr("concat_ws(',',flatten(transform(payload,x -&gt; transform(map_keys(x),y -&gt; concat(y,x[y])))))")
  • 嗨@Srinivas,感谢您的评论。我已经尝试了您的建议,但是在绘制架构时,我仍然得到有效载荷的类型为array,其元素的类型为map。所以它编译了很长时间(我有一个很大的数据框)但似乎什么也没做:(

标签: python apache-spark dictionary pyspark dataset


【解决方案1】:

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

【讨论】:

  • 嗨 Srinivas (@Srinivas ),非常感谢您的建议。我已经尝试了您建议的代码,但我收到了一个错误,我在问题正文的末尾显示为一个编辑。你知道怎么解决吗?也许您可以提供代码的更多详细信息?谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2021-11-19
  • 1970-01-01
  • 2020-06-24
  • 2020-11-10
  • 2023-03-20
相关资源
最近更新 更多