按日期排序Spark数据框列的数组

时间:2016-11-14 11:10:09

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

我有一个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]

你有什么想法吗?

1 个答案:

答案 0 :(得分:6)

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

因此我们定义了一个采用Row并返回mutable.WrappedArray[Row]的UDF:

Array[(Int, String)]