考虑以下数据框:
case class ArrayElement(id:Long,value:Double)
val df = Seq(
Seq(
ArrayElement(1L,-2.0),ArrayElement(2L,1.0),ArrayElement(0L,0.0)
)
).toDF("arr")
df.printSchema
root
|-- arr: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- id: long (nullable = false)
| | |-- value: double (nullable = false)
除了使用udf之外,还有一种方法可以按
arr
对value
进行排序?我看过
org.apache.spark.sql.functions.sort_array
,在复杂数组元素的情况下,此方法实际上在做什么?它是否按第一个元素(即id
)对数组进行排序
最佳答案
spark functions说:“根据数组元素的自然顺序,按升序对给定列的输入数组进行排序。”
在解释之前,让我们看一下sort_array的一些示例。
+----------------------------+----------------------------+
|arr |sorted |
+----------------------------+----------------------------+
|[[1,-2.0], [2,1.0], [0,0.0]]|[[0,0.0], [1,-2.0], [2,1.0]]|
+----------------------------+----------------------------+
+----------------------------+----------------------------+
|arr |sorted |
+----------------------------+----------------------------+
|[[0,-2.0], [2,1.0], [0,0.0]]|[[0,-2.0], [0,0.0], [2,1.0]]|
+----------------------------+----------------------------+
+-----------------------------+-----------------------------+
|arr |sorted |
+-----------------------------+-----------------------------+
|[[0,-2.0], [2,1.0], [-1,0.0]]|[[-1,0.0], [0,-2.0], [2,1.0]]|
+-----------------------------+-----------------------------+
因此sort_array的排序方式是先检查第一个元素,然后检查第二个元素,依此类推,对已定义列中数组中的每个元素进行排序
我希望它清楚
关于scala - 在Spark DataFrame中对结构数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47507767/