在scala DataFrame中的单行中查找不同列的最大值
Posted
技术标签:
【中文标题】在scala DataFrame中的单行中查找不同列的最大值【英文标题】:Find max value from different columns in a single row in scala DataFrame 【发布时间】:2019-10-16 06:36:01 【问题描述】:我试图从 scala 数据帧的单行中的不同列中找出最大值。
dataframe中可用的数据如下。
+-------+---------------------------------------+---------------------------------------+---------------------------------------+
| NUM| SIG1| SIG2| SIG3|
+-------+---------------------------------------+---------------------------------------+---------------------------------------+
|XXXXX01|["TIME":1569560531000,"VALUE":3.7825]|["TIME":1569560531001,"VALUE":4.7825]|["TIME":1569560531002,"VALUE":2.7825]|
|XXXXX01|["TIME":1569560541001,"VALUE":1.7825]|["TIME":1569560541000,"VALUE":8.7825]|["TIME":1569560541003,"VALUE":5.7825]|
|XXXXX01|["TIME":1569560531000,"VALUE":3.7825]|["TIME":1569560531009,"VALUE":3.7825]| null |
|XXXXX02|["TIME":1569560531000,"VALUE":5.7825]|["TIME":1569560531007,"VALUE":8.7825]|["TIME":1569560531006,"VALUE":3.7825]|
|XXXXX02|["TIME":1569560531000,"VALUE":9.7825]|["TIME":1569560531009,"VALUE":1.7825]|["TIME":1569560531010,"VALUE":3.7825]|
架构是
scala> DF.printSchema
root
|-- NUM: string (nullable = true)
|-- SIG1: string (nullable = true)
|-- SIG2: string (nullable = true)
|-- SIG3: string (nullable = true)
预期的输出如下。
+-------+--------------+----------+------------+------------+
| NUM| TIME | SIG1| | SIG2 | SIG3 |
+-------+--------------+----------+------------+------------+
|XXXXX01| 1569560531002| 3.7825 | 4.7825 | 2.7825 |
|XXXXX01| 1569560541003| 1.7825 | 8.7825 | 5.7825 |
|XXXXX01| 1569560531009| 3.7825 | 3.7825 | null |
|XXXXX02| 1569560531007| 5.7825 | 8.7825 | 3.7825 |
|XXXXX02| 1569560531010| 9.7825 | 1.7825 | 3.7825 |
我需要从单行和 SIG 列中添加一个具有最高 TIME 的新列及其值。
基本上,每列中的 TIME 将被该行中可用的最高 TIME 值替换,并分解 TIME 和 VALUE。
是否有任何 UDF/函数来实现这一点? 提前致谢。
【问题讨论】:
Iterate through a column in Dataset which have array of key value pairs and find out a pair with max value的可能重复 我已经在***.com/questions/58128746/…提供了相同问题的解决方案 【参考方案1】:使用get_json_object
函数从存储为字符串的json中提取值。
那么就很简单了:
DF.withColumn("TIME", greatest(get_json_object('SIG1, "$[0].TIME"),
get_json_object('SIG2, "$[0].TIME"),
get_json_object('SIG3, "$[0].TIME")))
.withColumn("SIG1", get_json_object('SIG1, "$[0].VALUE"))
.withColumn("SIG2", get_json_object('SIG2, "$[0].VALUE"))
.withColumn("SIG3", get_json_object('SIG3, "$[0].VALUE"))
.show
【讨论】:
以上是关于在scala DataFrame中的单行中查找不同列的最大值的主要内容,如果未能解决你的问题,请参考以下文章
在 Scala 中用不同的 DataType 展平一个 DataFrame
Dataframe Spark Scala中的最后一个聚合函数
将列表中的 n 个 DF 合并到单个 DataFrame - Scala