2016-08-03 2 views
8

У меня есть dataframe со следующей структурой:Как сгладить структуру в искровом фрейме?

|-- data: struct (nullable = true) 
| |-- id: long (nullable = true) 
| |-- keyNote: struct (nullable = true) 
| | |-- key: string (nullable = true) 
| | |-- note: string (nullable = true) 
| |-- details: map (nullable = true) 
| | |-- key: string 
| | |-- value: string (valueContainsNull = true) 

Как можно выровнять структуру и создать новую dataframe:

 |-- id: long (nullable = true) 
    |-- keyNote: struct (nullable = true) 
    | |-- key: string (nullable = true) 
    | |-- note: string (nullable = true) 
    |-- details: map (nullable = true) 
    | |-- key: string 
    | |-- value: string (valueContainsNull = true) 

Есть ли что-то вроде взорваться, но и для структур?

+0

Ответы на https://stackoverflow.com/questions/37471346/automatically-and-elegantly-flatten-dataframe-in-spark-sql также были полезны. – erwaman

ответ

21

Это должно работать в Спарк 1.6 или более поздней версии:

df.select(df.col("data.*")) 

или

df.select(df.col("data.id"), df.col("data.keyNote"), df.col("data.details")) 
+3

Исключение из потока "main" org.apache.spark.sql.AnalysisException: Нет такого поля struct * – djWann

+0

, но с использованием select во всех столбцах, таких как df.select (df.col1, df.col2, df.col3) работает, поэтому Я согласен с этим ответом – djWann

+0

Я просто редактировал, но это странно. Я могу использовать *. Может быть, проблема с версией? –

1

Простой способ заключается в использовании SQL, можно создать строку SQL запроса для псевдонимов вложенными столбцов, как плоские ,

  1. Получение данных кадра схемы (df.schema())
  2. преобразование схемы в SQL (для (поля:. Схемы() поля()) ....
  3. запрос «Вал newDF = sqlContext.sql ("SELECT" + sqlGenerated + "от источника")

пример в Java:

https://gist.github.com/ebuildy/3de0e2855498e5358e4eed1a4f72ea48

(Я предпочитаю SQL-путь, поэтому вы можете легко протестировать его на Spark-shell и перекрестном языке).

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