在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

将DataFrame转换为scala中的字符串

Spark Streaming Scala 将不同结构的 json 组合成一个 DataFrame

使用 Pyspark 将每个 json 对象读取为 Dataframe 中的单行?