从嵌套数组/结构查询字段

时间:2020-07-14 16:19:44

标签: apache-spark pyspark apache-spark-sql

我刚刚开始使用JSON数据,并具有以下架构:

root
 |-- parameters: array (nullable = true)
 |    |-- element: array (containsNull = true)
 |    |    |-- element: struct (containsNull = true)
 |    |    |    |-- name: string (nullable = true)
 |    |    |    |-- value: string (nullable = true)

我正在尝试使用来查询数据,但收到一条错误消息,指出参数不存在结构字段:

df.select("parameters[0].name").show()

错误:

pyspark.sql.utils.AnalysisException: u'No such struct field parameters[0] 

有人可以让我知道在不进行任何转换的情况下查询此嵌套数据的最简单方法是什么吗?

2 个答案:

答案 0 :(得分:0)


import pyspark.sql.functions as F
df.select(F.posexplode("parameters").alias("position","parameters")).where('position = 0').select('parameters.name')

答案 1 :(得分:0)

假设您具有使用ArrayType作为列类型之一的数据框

from pyspark.sql import functions as F

df_b = spark.createDataFrame([('1',['10', '20'])],[ "ID","TYPE"])
+---+--------+
| ID|    TYPE|
+---+--------+
|  1|[10, 20]|
+---+--------+

然后,如果您尝试从Array列中提取数据,则可以使用- getItem(),如下所示

df_b = df_b.withColumn('type_col_1', F.col('TYPE').getItem(0))
df_b = df_b.withColumn('type_col_2', F.col('TYPE').getItem(1))
df_b.show()
+---+--------+----------+----------+
| ID|    TYPE|type_col_1|type_col_2|
+---+--------+----------+----------+
|  1|[10, 20]|        10|        20|
+---+--------+----------+----------+