使用 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'> 的对象