【问题标题】:Spark SQL - Nested array conditional selectSpark SQL - 嵌套数组条件选择
【发布时间】:2017-05-03 19:55:16
【问题描述】:

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

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

```

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

```

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

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

如何在 SparkSQL 中最好地做到这一点?

干杯,谢谢!

【问题讨论】:

  • 除非你 explode 唯一的选择是 UDF,这取决于你使用的语言。
  • 谢谢,我正在使用 scala - 我不想爆炸
  • 使用 Scala 您还可以转换为静态类型的Dataset。或者如上所述,使用udf。如果你知道索引,你也可以使用它,但我假设你不知道。
  • 你考虑过接受我的回答吗?

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


【解决方案1】:

使用 UDF,这可能看起来像这样,给定一个 Dataframe(字符串类型的所有属性):

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2020-12-07
    • 2010-10-04
    • 1970-01-01
    相关资源
    最近更新 更多