Dar*_*hta 1 scala apache-spark apache-spark-sql
Spark版本2.1
我正在将文件读取为Spark dataframe,格式如下:
{
"field1": "value1",
"field2": "value2",
"elements": [{
"id": "1",
"name": "a"
},
{
"id": "2",
"name": "b"
},
{
"id": "3",
"name": "c"
}]
}
Run Code Online (Sandbox Code Playgroud)
它包含一个array嵌套的元素,现在我想explode的elements阵列,以获得平坦的JSON结构。我正在使用以下代码:
var dfExploded = df
.withColumn("id",
explode(df.col("elements.id")))
.withColumn("name",
explode(df.col("elements.name")));
Run Code Online (Sandbox Code Playgroud)
它似乎正在返回笛卡尔积(例如,我在结果中得到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|
>> +--------+------+------+
Run Code Online (Sandbox Code Playgroud)
第一步基本上是将数组变成单独的记录。您需要对数组本身(元素)而不是内部元素进行处理
接下来你可以做
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|
>> +---+----+------+------+
Run Code Online (Sandbox Code Playgroud)
展平元素