2017-02-22 29 views
0

Спарк Версии 2.1Spark: Взорвать пару вложенных столбцов

Я читаю файл в искру dataframe с следующим форматом:

{ 
    "field1": "value1", 
    "field2": "value2", 
    "elements": [{ 
     "id": "1", 
     "name": "a" 
    }, 
    { 
     "id": "2", 
     "name": "b" 
    }, 
    { 
     "id": "3", 
     "name": "c" 
    }] 
} 

Он содержит array вложенных элементы, теперь я хочу explode массив elements, чтобы получить плоскую структуру json. Я использую следующий код:

var dfExploded = df 
    .withColumn("id", 
     explode(df.col("elements.id"))) 
    .withColumn("name", 
     explode(df.col("elements.name"))); 

кажется, возвращается декартово произведение (например, я получаю 9 элементов в результате в то время как я хочу только 3). Есть ли способ указать пару вложенных столбцов на функцию explode?

+0

возможно превратить Id + имя в кортеж? –

ответ

2

Если я правильно понимаю, что вы хотели, вы можете попробовать это:

val exploded = df.withColumn("elements", explode($"elements")) 
exploded.show() 
>> +--------+------+------+ 
>> |elements|field1|field2| 
>> +--------+------+------+ 
>> | [1,a]|value1|value2| 
>> | [2,b]|value1|value2| 
>> | [3,c]|value1|value2| 
>> +--------+------+------+ 

Это первый шаг в основном превращает массив в отдельные записи. Вы должны сделать это на самом (элементы) массив, а не элементы внутри

Далее вы можете сделать

val flattened = exploded.select("elements.*", "field1", "field2") 
flattened.show() 
>> +---+----+------+------+ 
>> | id|name|field1|field2| 
>> +---+----+------+------+ 
>> | 1| a|value1|value2| 
>> | 2| b|value1|value2| 
>> | 3| c|value1|value2| 
>> +---+----+------+------+ 

Чтобы разгладить элементы

+0

Спасибо за ваш вклад. Теперь я понимаю разницу между одним «взрывом» с 'select' и несколькими' взрывами'. Работает как шарм :) –

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

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