(py) Запуск GetItem () в синтаксисе SQL

#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. да! делает мой вложенный запрос намного проще для глаз!