Apache spark 如何从结构数组中提取所有元素?

Apache spark 如何从结构数组中提取所有元素?,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我有一个具有不同列的数据框,其中一列是一个结构数组: +----------+---------+--------------------------------------+ |id |title | values| +----------+---------+--------------------------------------+ | 1 | aaa | [{name1,

我有一个具有不同列的数据框,其中一列是一个结构数组:

+----------+---------+--------------------------------------+
|id        |title    |                                values|
+----------+---------+--------------------------------------+
|        1 | aaa     |      [{name1, id1}, {name2, id2},...]|
|        2 | bbb     |  [{name11, id11}, {name22, id22},...]|
此列的我的df架构如下所示:

|-- values: array (nullable = true)
|    |-- element: struct (containsNull = true)
|    |    |-- name: string (nullable = true)
|    |    |-- id: long (nullable = true)
+----------+---------+--------------+
|id        |title    |name   |   _id|
+----------+---------+--------------+
|        1 | aaa     | name1 |  id1 |
|        1 | aaa     | name2 |  id2 |
|        2 | bbb     | name11| id11 |
|        2 | bbb     | name22| id22 |
我想从这个数组列中提取每个值,如下所示:

|-- values: array (nullable = true)
|    |-- element: struct (containsNull = true)
|    |    |-- name: string (nullable = true)
|    |    |-- id: long (nullable = true)
+----------+---------+--------------+
|id        |title    |name   |   _id|
+----------+---------+--------------+
|        1 | aaa     | name1 |  id1 |
|        1 | aaa     | name2 |  id2 |
|        2 | bbb     | name11| id11 |
|        2 | bbb     | name22| id22 |
我想出了如何提取数组的单个项:

df = df.withColumn("name", df["values"].getItem(0).name)\
.withColumn("_id", df["id"].getItem(0).id)\
但我不知道如何将其应用于整个数组长度。我可能应该这样做:

for index in range(len(df.values)):
    df = df.withColumn("name", df["values"].getItem(index).name)\
    .withColumn("_id", df["id"].getItem(index).id)\
你能帮我解决这个问题吗?
谢谢

只需分解并选择

from pyspark.sql.functions import col, explode

df.withColumn("values", explode("values")).select(
  "*", col("values")["name"].alias("name"), col("values")["id"].alias("id")
)

进一步扩展解决方案。您可以使用此方法通过使用col(“col_name.*)来选择struct字段中的所有元素,而不是单独提取每个struct元素


谢谢还有一个问题:如果我不知道结构中元素的确切名称,如何从中提取所有元素?在本例中,我们已经知道struct中的两个元素是
name
id