星火:爆炸一对嵌套列

问题描述:

星火2.1版星火:爆炸一对嵌套列

我读入文件到火花dataframe具有以下格式:

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

它包含嵌套元素的array,现在我想explodeelements数组得到扁平的json结构。我使用下面的代码:

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

这似乎是返回笛卡尔积(例如我得到的结果9个元件,而我只想要3)。有什么办法可以指定一对嵌套列到explode函数?

+0

也许把编号+姓名到元组? –

如果我理解正确的话,你会希望你可以试试这个:

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

感谢您的输入。现在我明白了'explode'与'select'和多个'explode'调用之间的区别。奇迹般有效 :) –