#apache-spark #pyspark #apache-spark-sql
#apache-spark #pyspark #apache-spark-sql
Вопрос:
n-й элемент столбца типа массива может быть извлечен с помощью getitem(n)
. Столбцы, типизированные на карте, могут быть разделены с помощью либо getItem(key)
или 'column.key'
. Существует ли аналогичный синтаксис для массивов?
Контекст: цель состоит в том, чтобы извлекать определенные поля из массивно вложенного json в удобочитаемом виде.
from pyspark import SparkContext
from pyspark.sql import SparkSession
sc = SparkContext.getOrCreate()
spark = SparkSession(sc)
sample = spark.createDataFrame([[[1,2,3]]], ['a'])
sample.show
---------
| a|
---------
|[1, 2, 3]|
---------
работает
sample.select(f.col('a').getItem(0))
sample.select('a')
не работает
sample.select('a.0')
sample.select('a[0]')
# etc
Комментарии:
1. если вы зарегистрируете образец как временную таблицу, то spark.sql (выберите a[0] из T) должен работать
Ответ №1:
вы забываете expr
функцию при использовании sql.
sample = spark.createDataFrame([[[1,2,3]]], ['a'])
sample.show()
# ---------
#| a|
# ---------
#|[1, 2, 3]|
# ---------
sample.select(expr("a[0]")).show()
# ----
#|a[0]|
# ----
#| 1|
# ----
Комментарии:
1. да! делает мой вложенный запрос намного проще для глаз!