2016-05-11 2 views
3

У меня есть Спарк DataFrame df со следующей схемой:выбрать конкретные столбцы в Спарке DataFrames из Массива Struct

root 
|-- k: integer (nullable = false) 
|-- v: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- a: integer (nullable = false) 
| | |-- b: double (nullable = false) 
| | |-- c: string (nullable = true) 

Можно ли просто выбрать a, c в v из df, не делая map? В частности, df загружается из файла Parquet, и я не хочу, чтобы значения для c были даже загружены/прочитаны.

ответ

1

Это зависит от того, что вы ожидаете от вывода, что неясно из вашего вопроса. Позвольте пояснить. Вы можете сделать

df.select($"v.a",$"v.b").show() 

однако, результат может быть не то, что вы хотите, так как v массив, он даст массив для и один в б. Что вы можете сделать, это explode массив v, затем выберите из взорванного dataframe:

df.select(explode($"v").as("v" :: Nil)).select($"v.a", $"v.b").show() 

это будет выравниваться V к столу со всеми его значениями уплощенных. В любом случае, искра/паркет должен быть достаточно умным, чтобы использовать предикат, нажимая вниз и не загружать c вообще.

 Смежные вопросы

  • Нет связанных вопросов^_^