【问题标题】:Need to access specific element from array column in spark dataframe需要从 spark 数据框中的数组列访问特定元素
【发布时间】:2021-05-10 19:37:05
【问题描述】:

我在 Spark DataFrame 中有一个包含两个元素的数组列,我需要获取具有特定模式而不是位置 id 的第二个元素。

输入数据帧:

+---+------------+----+
| id|    objectid|name|
+---+------------+----+
|100|[100, AB100]| ABC|
|200|[200, AB200]| CDE|
+---+------------+----+

DataFrame 架构:

root
 |-- id: integer (nullable = false)
 |-- objectid: array (nullable = true)
 |    |-- element: string (containsNull = true)
 |-- name: string (nullable = true)

预期输出:

+---+--------+----+
| id|objectid|name|
+---+--------+----+
|100|   AB100| ABC|
|200|   AB200| CDE|
+---+--------+----+

【问题讨论】:

  • 在列上使用过滤器找到匹配值然后爆炸?

标签: apache-spark apache-spark-sql


【解决方案1】:

您可以使用withColumn 通过以下方式更新objectid 列:

  1. 通过concat_ws方法(Scala docs)将objectid转换成String,以空格 作为元素之间的分隔符(Scala docs),然后

  2. 通过regexp_extract 方法将所需的String 与提取Strings 的正则表达式匹配,该表达式以2 个字母开头并以3 个数字结尾(Scala docs

我想您使用的是 Scala,但您可以理解以下命令背后的核心思想,如果碰巧您使用其中一种语言,则可以将其“翻译”为 Python 或 Java。 df 是 DataFrame 的名称,concat_ws 接受分隔符和列作为参数,regexp_extract 接受列、正则表达式和正则表达式的组 ID 以匹配 String(您可以在上面的文档链接中了解有关参数的更多信息)。

您可以使用两个withColumn 命令来做到这一点:

df.withColumn("objectid", concat_ws(" ", col("objectid")))
          .withColumn("objectid", regexp_extract(col("objectid"), "[\\w]{2}[\\d]{3}", 0))

或者只有一个 concat_ws 嵌套在 regexp_extract 中:

df.withColumn("objectid", regexp_extract(concat_ws(" ", col("objectid")), "[\\w]{2}[\\d]{3}", 0))

给定输出:

+---+--------+----+
| id|objectid|name|
+---+--------+----+
|100|   AB100| ABC|
|200|   AB200| CDE|
+---+--------+----+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-09
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    相关资源
    最近更新 更多