gpt4 book ai didi

scala - 按日期对 Spark DataFrame 列的数组进行排序

转载 作者:行者123 更新时间:2023-12-03 04:24:47 26 4
gpt4 key购买 nike

我有一个格式如下的 DataFrame:

+---+------------------------------------------------------+
|Id |DateInfos |
+---+------------------------------------------------------+
|B |[[3, 19/06/2012-02.42.01], [4, 17/06/2012-18.22.21]] |
|A |[[1, 15/06/2012-18.22.16], [2, 15/06/2012-09.22.35]] |
|C |[[5, 14/06/2012-05.20.01]] |
+---+------------------------------------------------------+

我想按日期对 DateInfos 列的每个元素进行排序,并使用数组第二个元素中的时间戳

+---+------------------------------------------------------+
|Id |DateInfos |
+---+------------------------------------------------------+
|B |[[4, 17/06/2012-18.22.21], [3, 19/06/2012-02.42.01]] |
|A |[[2, 15/06/2012-09.22.35], [1, 15/06/2012-18.22.16]] |
|C |[[5, 14/06/2012-05.20.01]] |
+---+------------------------------------------------------+

我的 DataFrame 的架构打印如下:

root
|-- C1: string (nullable = true)
|-- C2: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- _1: integer (nullable = false)
| | |-- _2: string (nullable = false)

我假设我必须创建一个 udf,它使用具有以下签名的函数:

def sort_by_date(mouvements : Array[Any]) : Array[Any]

你有什么想法吗?

最佳答案

这确实有点棘手 - 因为虽然 UDF 的输入和输出类型看起来相同,但我们实际上不能那样定义它 - 因为输入实际上是一个 mutable.WrappedArray[Row] 并且输出不能使用Row,否则 Spark 将无法将其解码行...

因此,我们定义一个 UDF,它采用 mutable.WrappedArray[Row] 并返回 Array[(Int, String)]:

val sortDates = udf { arr: mutable.WrappedArray[Row] =>
arr.map { case Row(i: Int, s: String) => (i, s) }.sortBy(_._2)
}

val result = input.select($"Id", sortDates($"DateInfos") as "DateInfos")

result.show(truncate = false)
// +---+--------------------------------------------------+
// |Id |DateInfos |
// +---+--------------------------------------------------+
// |B |[[4,17/06/2012-18.22.21], [3,19/06/2012-02.42.01]]|
// |A |[[2,15/06/2012-09.22.35], [1,15/06/2012-18.22.16]]|
// |C |[[5,14/06/2012-05.20.01]] |
// +---+--------------------------------------------------+

关于scala - 按日期对 Spark DataFrame 列的数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40587348/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com