2017-02-20 27 views
2

Я в настоящее время dataframe с идентификатором и столбца, который массив структур:Спарк: взрывать dataframe массив структур и добавить идентификатор

root 
|-- id: integer (nullable = true) 
|-- lists: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- text: string (nullable = true) 
| | |-- amount: double (nullable = true) 

Ниже приведен пример таблицы с данными:

id | lists 
----------- 
1 | [[a, 1.0], [b, 2.0]] 
2 | [[c, 3.0]] 

Как преобразовать приведенный выше фреймворк данных в нижеследующее? Мне нужно «взорвать» массив и добавить его одновременно.

id | col1 | col2 
----------------- 
1 | a  | 1.0 
1 | b  | 2.0 
2 | c  | 3.0 

Под редакцией Примечание:

Примечание есть разница между этими двумя примерами ниже. Первый содержит «массив структур элементов». В то время как позднее просто содержит «массив элементов».

root 
|-- id: integer (nullable = true) 
|-- lists: array (nullable = true) 
| |-- element: struct (containsNull = true) 
| | |-- text: string (nullable = true) 
| | |-- amount: double (nullable = true) 


root 
|-- a: long (nullable = true) 
|-- b: array (nullable = true) 
| |-- element: long (containsNull = true) 
+1

Возможный дубликат [Сведение строк в Спарк] (http://stackoverflow.com/questions/32906613/flattening-rows-in-spark) –

+0

Этот вопрос имеет более простой фрейм, где второй столбец - это просто массив. Мина отличается тем, что мой второй столбец является «массивом структур». – Steve

ответ

4

explode именно функция:

import org.apache.spark.sql.functions._ 

df.select($"id", explode($"lists")).select($"id", $"col.text", $"col.amount") 
+0

Это не работает, потому что после взрыва я получаю: (1, [a, 1.0]) \ n (1, | [b, 2.0]) \ n (2, [c, 3.0]) Это половина пути, но мне нужно также разделить список на отдельные столбцы. Ваш код, возможно, работал для простого случая, если это всего лишь массив элементов, но у меня есть «массив структур» – Steve

+0

Я просто применил то, что включено в решение, которое работает так же, как ожидалось Стив. Он разделяет список на отдельные столбцы. Thanx – Vezir