使用 pyspark 将 StructType、ArrayType 转换/转换为 StringType(单值)

Posted

技术标签:

【中文标题】使用 pyspark 将 StructType、ArrayType 转换/转换为 StringType(单值)【英文标题】:Convert / Cast StructType, ArrayType to StringType (Single Valued) using pyspark 【发布时间】:2020-07-09 19:34:06 【问题描述】:

我的一个 Dataframe(spark.sql) 有这个架构。

root
 |-- ValueA: string (nullable = true)
 |-- ValueB: struct (nullable = true)
 |    |-- abc: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- a0: string (nullable = true)
 |    |    |    |-- a1: string (nullable = true)
 |    |    |    |-- a2: string (nullable = true)
 |    |    |    |-- a3: string (nullable = true)
 |-- ValueC: struct (nullable = true)
 |    |-- pqr: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- info1: string (nullable = true)
 |    |    |    |-- info2: struct (nullable = true)
 |    |    |    |    |-- x1: long (nullable = true)
 |    |    |    |    |-- x2: long (nullable = true)
 |    |    |    |    |-- x3: string (nullable = true)
 |    |    |    |-- info3: string (nullable = true)
 |    |    |    |-- info4: string (nullable = true)
 |-- Value4: struct (nullable = true)
 |    |-- xyz: array (nullable = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- b0: string (nullable = true)
 |    |    |    |-- b2: string (nullable = true)
 |    |    |    |-- b3: string (nullable = true)
 |-- Value5: string (nullable = true)

我需要将其保存为 CSV 文件,但不使用任何拼合,按以下格式展开。

 |-- ValueA: string (nullable = true)
 |-- ValueB: struct (nullable = true)
 |-- ValueC: struct (nullable = true)
 |-- ValueD: struct (nullable = true)
 |-- ValueE: string (nullable = true)

我已经直接使用命令[df.to_pandas().to_csv("output.csv")] 这符合我的目的,但我需要一个更好的方法。我正在使用 pyspark

【问题讨论】:

【参考方案1】:

在 Spark 中编写 csv 格式还不支持编写 struct/array..etc 复杂类型。

Write as Parquet file:

在 Spark 中更好的方法是编写为 parquet 格式,因为 parquet 格式支持所有 nested data types 并在读/写时提供更好的性能。 p>

df.write.parquet("<path>")

Write as Json file:

如果以json格式写入则接受

df.write.json("path")
#or
df.toJSON().saveAsTextFile("path")

Write as CSV file:

使用 to_json 函数将 json struct/Array 转换为 string 并存储为 csv 格式。

df.selectExpr("valueA","to_json(ValueB)"..etc).write.csv("path")

【讨论】:

感谢@Shu 的回复。好吧,我只想要(CSV)格式。我试过做'to_json(ValueB)'。这会将文件另存为 CSV,但创建的文件会意外拆分列。我猜这些来自 to_json 格式。

以上是关于使用 pyspark 将 StructType、ArrayType 转换/转换为 StringType(单值)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pyspark 中使用 pandas UDF 并在 StructType 中返回结果

Spark 2.1.1 上的 Pyspark,StructType 中的 StructFields 始终可以为空

Pyspark - 循环通过 structType 和 ArrayType 在 structfield 中进行类型转换

pySpark:如何在数据框中的 arrayType 列中获取 structType 中的所有元素名称?

PySpark:TypeError:StructType 不能接受类型为 <type 'unicode'> 或 <type 'str'> 的对象

如何将火花行(StructType)投射到scala案例类