Spark:爆炸一对嵌套列

时间:2017-02-22 08:06:30

标签: 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"
    }]
}

它包含array个嵌套元素,现在我想explode elements数组来获取平面json结构。我使用以下代码:

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

它似乎正在返回笛卡尔积(例如,我在结果中得到9个元素,而我只想要3个)。有没有办法可以为explode函数指定一对嵌套列?

1 个答案:

答案 0 :(得分:4)

如果我理解正确,你可以试试这个:

 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|
 >> +---+----+------+------+

展平元素