如何访问数组列中的值?

时间:2017-12-01 01:23:25

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

我有一个包含一列的Dataframe。该列的每一行都有一个String值数组:

Spark 2.2 Dataframe中的值

this.doRefresh();

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

4 个答案:

答案 0 :(得分:8)

 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

答案 1 :(得分:3)

  

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

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

  

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

您还可以使用(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后跟select distinct给出正确的答案(正如@Will所做的那样)。

答案 2 :(得分:3)

您可以执行以下操作

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

答案 3 :(得分:1)