如何从数组<struct>中找到“最低”元素?

时间:2017-10-27 13:10:17

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

我有一个包含以下架构的数据框 -

|-- ID: string (nullable = true)
|-- VALUES: array (nullable = true)
|    |-- element: struct (containsNull = true)
|    |    |-- _v1: string (nullable = true)
|    |    |-- _v2: string (nullable = true)

VALUES就像 -

[["1","a"],["2","b"],["3","c"],["4","d"]]
[["4","g"]]
[["3","e"],["4","f"]]

我想取最低整数的VALUES即 结果df应该看起来像 - (现在是StructType,而不是Array [Struct])

["1","a"]
["4","g"]
["3","e"]

有人可以指导我如何通过创建一个udf来解决这个问题? 提前谢谢。

2 个答案:

答案 0 :(得分:3)

您不需要UDF。只需使用sort_array并选择第一个元素。

df.show
+--------------------+
|            data_arr|
+--------------------+
|[[4,a], [2,b], [1...|
|             [[1,a]]|
|      [[3,b], [1,v]]|
+--------------------+

df.printSchema
root
 |-- data_arr: array (nullable = false)
 |    |-- element: struct (containsNull = false)
 |    |    |-- col1: string (nullable = false)
 |    |    |-- col2: string (nullable = false)


import org.apache.spark.sql.functions.sort_array

df.withColumn("first_asc", sort_array($"data_arr")(0)).show
+--------------------+---------+
|            data_arr|first_asc|
+--------------------+---------+
|[[4,a], [2,b], [1...|    [1,c]|
|             [[1,a]]|    [1,a]|
|      [[3,b], [1,v]]|    [1,v]|
+--------------------+---------+

答案 1 :(得分:0)

使用与示例中相同的数据框:

val findSmallest = udf((rows: Seq[Row]) => {
    rows.map(row => (row.getAs[String](0), row.getAs[String](1))).sorted.head
})

df.withColumn("SMALLEST", findSmallest($"VALUES"))

会得到这样的结果:

+---+--------------------+--------+
| ID|              VALUES|SMALLEST|
+---+--------------------+--------+
|  1|[[1,a], [2,b], [3...|   [1,2]|
|  2|             [[4,e]]|   [4,g]|
|  3|      [[3,g], [4,f]]|   [3,g]|
+---+--------------------+--------+

如果您只希望最终值使用select("SMALLEST)