pySpark:如何在数据框中的 arrayType 列中获取 structType 中的所有元素名称?
Posted
技术标签:
【中文标题】pySpark:如何在数据框中的 arrayType 列中获取 structType 中的所有元素名称?【英文标题】:pySpark: How can I get all element names in structType in arrayType column in a dataframe? 【发布时间】:2021-04-08 02:11:56 【问题描述】:我有一个看起来像这样的数据框:
|-- name: string (nullable = true)
|-- age: string (nullable = true)
|-- job: string (nullable = true)
|-- hobbies: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- favorite: string (nullable = true)
| | |-- non-favorite: string (nullable = true)
我正在尝试获取这些信息:
['favorite', 'non-favorite']
但是,我找到的唯一最接近的解决方案是使用带有 withColumn
的explode 函数,但它是基于我已经知道元素名称的假设。但我想做的是,在不知道元素名称的情况下,我只想用列名来获取元素名称,在这种情况下是“爱好”。
有没有一种好方法可以获取任何给定列中的所有元素名称?
【问题讨论】:
【参考方案1】:对于具有此架构的给定数据框:
df.printSchema()
root
|-- hobbies: array (nullable = false)
| |-- element: struct (containsNull = false)
| | |-- favorite: string (nullable = false)
| | |-- non-favorite: string (nullable = false)
您可以选择结构的字段名称为:
struct_fields = df.schema['hobbies'].dataType.elementType.fieldNames()
# output: ['favorite', 'non-favorite']
【讨论】:
【参考方案2】:pyspark.sql.types.StructType.fieldnames
应该会得到你想要的。
fieldNames() Returns all field names in a list. >>> struct = StructType([StructField("f1", StringType(), True)]) >>> struct.fieldNames() ['f1']
所以在你的情况下是这样的
dataframe.hobbies.getItem(0).fieldnames()
【讨论】:
以上是关于pySpark:如何在数据框中的 arrayType 列中获取 structType 中的所有元素名称?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PySpark 中将字符串转换为字典 (JSON) 的 ArrayType
如何在 Pyspark 中将 ArrayType 的列转换为 Dictionary