星火:爆炸一对嵌套列
问题描述:
星火2.1版星火:爆炸一对嵌套列
我读入文件到火花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
函数?
答
如果我理解正确的话,你会希望你可以试试这个:
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'调用之间的区别。奇迹般有效 :) –
也许把编号+姓名到元组? –