Spark SQL - 嵌套数组条件选择

时间:2017-05-03 10:03:13

标签: scala apache-spark apache-spark-sql spark-dataframe

我有一个火花SQL问题我很欣赏有关从嵌套数组结构中进行条件选择的最佳方法的一些指导。

我在下面有一个示例json文档

```

{
   "id":"p1",
   "externalIds":[
      {"system":"a","id":"1"},
      {"system":"b","id":"2"},
      {"system":"c","id":"3"}
    ]
}

```

在spark SQL中,我想根据一些条件逻辑选择其中一个数组结构的“id”。

例如,如上所述,选择具有“system”=“b”的数组子元素的id字段,即id为“2”。

如何在SparkSQL中做到最好?

干杯谢谢!

1 个答案:

答案 0 :(得分:1)

使用UDF,给定一个Dataframe(String类型的所有属性),它看起来像这样:

+---+---------------------+
|id |externalIds          |
+---+---------------------+
|p1 |[[a,1], [b,2], [c,3]]|
+---+---------------------+

定义一个UDF来遍历你的数组并找到所需的元素:

def getExternal(system: String) = {
  udf((row: Seq[Row]) =>
    row.map(r => (r.getString(0), r.getString(1)))
      .find { case (s, _) => s == system}
      .map(_._2)
      .orElse(None)
  )
}

并像这样使用它:

df
  .withColumn("external",getExternal("b")($"externalIds"))
  .show(false)

+---+---------------------+--------+
|id |externalIds          |external|
+---+---------------------+--------+
|p1 |[[a,1], [b,2], [c,3]]|2       |
+---+---------------------+--------+