Spark:爆炸一对嵌套的列

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嵌套的元素,现在我想explodeelements阵列,以获得平坦的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起作用?

Ass*_*son 5

如果我理解正确,那么您可以尝试以下操作:

 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)

展平元素