火花:爆炸了一对嵌套柱



火花版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|
 >> +---+----+------+------+

弄平元素

相关内容

  • 没有找到相关文章

最新更新