scala – 按日期排序Spark DataFrame列的数组
发布时间:2020-12-16 09:55:52 所属栏目:安全 来源:网络整理
导读:我有一个DataFrame格式如下: +---+------------------------------------------------------+|Id |DateInfos |+---+------------------------------------------------------+|B |[[3,19/06/2012-02.42.01],[4,17/06/2012-18.22.21]] ||A |[[1,15/06/2012-1
我有一个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列的每个元素与我的Array的第二个元素中的时间戳排序 +---+------------------------------------------------------+ |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,19/06/2012-02.42.01]]| // |A |[[2,15/06/2012-18.22.16]]| // |C |[[5,14/06/2012-05.20.01]] | // +---+--------------------------------------------------+ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |