use*_*308 12 scala apache-spark apache-spark-sql
我有一个包含一列的Dataframe.该列的每一行都有一个String值数组:
我的Spark 2.2 Dataframe中的值
["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)
Run Code Online (Sandbox Code Playgroud)
访问数组中元素的最佳方法是什么?例如,我想在2017年的第四个元素中提取不同的值(回答"ABC","DEF").
Wil*_*ill 11
df.where($"col".getItem(2) === lit("2017")).select($"col".getItem(3))
Run Code Online (Sandbox Code Playgroud)
看到getItem从https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.Column
从Spark 2.4.0开始,有一个新功能element_at($array_column, $index)。
请参阅:https : //spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.functions$@element_at(column : org.apache.spark.sql.Column,value :Any):org.apache.spark.sql.Column
访问数组中元素的最佳方法是什么?
通过getItem运算符访问数组列中的元素。
getItem(key:Any):列一个表达式,该表达式从数组中的第几个位置获取一个项目,或通过中的键值获取一个值
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|
+------+
Run Code Online (Sandbox Code Playgroud)
这只是个人选择和品味的问题,哪种方法更适合您(即getItem简单)(ordinal)。
而在你的情况下where/ filter后面select有distinct提供正确的答案(如@Will一样)。
| 归档时间: |
|
| 查看次数: |
17853 次 |
| 最近记录: |