【问题标题】:How to access values in array column?如何访问数组列中的值?
【发布时间】:2018-05-15 01:55:31
【问题描述】:

我有一个包含一列的数据框。该列的每一行都有一个字符串值数组:

我的 Spark 2.2 数据框中的值

["123", "abc", "2017", "ABC"]
["456", "def", "2001", "ABC"]
["789", "ghi", "2017", "DEF"]

org.apache.spark.sql.DataFrame = [col: array]

root
|-- col: array (nullable = true)
|    |-- element: string (containsNull = true)

访问数组中元素的最佳方式是什么?例如,我想在 2017 年的第四个元素中提取不同的值(回答“ABC”、“DEF”)。

【问题讨论】:

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


    【解决方案1】:

    自Spark 2.4.0 起,新增功能element_at($array_column, $index)

    See Spark docs

    【讨论】:

    • 这很有帮助。节省了很多时间。我正计划编写一个 UDF 来执行此操作,但结果出错了。这个答案很棒。
    • 我希望这存在于 Spark 2.3.0 中。有没有等价物?
    • @AlexMoore-Niemi:您可以使用getItem,在此处查看其他答案。
    【解决方案2】:
     df.where($"col".getItem(2) === lit("2017")).select($"col".getItem(3))
    

    https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.Column看到getItem

    【讨论】:

    • 有趣的是,如果索引超出范围,getItem 将简单地返回 NULL 而不是抛出异常。
    【解决方案3】:

    访问数组中元素的最佳方式是什么?

    通过getItem 运算符访问数组列中的元素。

    getItem(key: Any): Column 一个表达式,从数组中获取位于序号位置的项目,或者通过MapType 中的键key 获取值。

    您还可以使用(ordinal) 访问位于ordinal 位置的元素。

    val ds = Seq(
      Array("123", "abc", "2017", "ABC"),
      Array("456", "def", "2001", "ABC"),
      Array("789", "ghi", "2017", "DEF")).toDF("col")
    scala> ds.printSchema
    root
     |-- col: array (nullable = true)
     |    |-- element: string (containsNull = true)
    scala> ds.select($"col"(2)).show
    +------+
    |col[2]|
    +------+
    |  2017|
    |  2001|
    |  2017|
    +------+
    

    这只是个人选择和品味的问题,哪种方法更适合您,即getItem 或简单地(ordinal)

    在您的情况下,where / filter 后跟 selectdistinct 给出正确答案(就像 @Will 所做的那样)。

    【讨论】:

      【解决方案4】:

      您可以执行以下操作

      import org.apache.spark.sql.functions._
      
      val ds = Seq(
       Array("123", "abc", "2017", "ABC"),
       Array("456", "def", "2001", "ABC"),
       Array("789", "ghi", "2017", "DEF")).toDF("col")
      
      ds.withColumn("col1",element_at('col,1))
      .withColumn("col2",element_at('col,2))
      .withColumn("col3",element_at('col,3))
      .withColumn("col4",element_at('col,4))
      .drop('col)
      .show()
      
      +----+----+----+----+
      |col1|col2|col3|col4|
      +----+----+----+----+
      | 123| abc|2017| ABC|
      | 456| def|2001| ABC|
      | 789| ghi|2017| DEF|
      +----+----+----+----+
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-12
        • 2018-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-10
        • 1970-01-01
        相关资源
        最近更新 更多