Запросы полей из вложенных массивов / структур - PullRequest
0 голосов
/ 14 июля 2020

Я только начал работать с данными JSON и имею следующую схему для работы:

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

Я пытаюсь запросить данные, используя, но получаю сообщение об ошибке, что поле Struct отсутствует для параметров:

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

Ошибка:

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

Может кто-нибудь дайте мне знать, какой самый простой способ запросить эти вложенные данные без каких-либо преобразований?

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Предполагая, что у вас есть фрейм данных с 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|
+---+--------+----------+----------+
0 голосов
/ 14 июля 2020

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