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中将字符串列转换为ArrayType

如何在 PySpark 中将字符串转换为字典 (JSON) 的 ArrayType

如何在pyspark中将字符串值转换为arrayType

如何在 Pyspark 中将 ArrayType 的列转换为 Dictionary

如何创建一列数组,其值来自一列并且它们的长度来自pyspark数据帧中的另一列?

在 PySpark 中将 StringType 转换为 ArrayType