使用Spark Sql或Pyspark从一系列时间戳中获取不同的Max

dy1byipe  于 2023-05-28  发布在  Spark
关注(0)|答案(1)|浏览(148)

我有一个表格,格式如下:

以下是更友好的数据集:
| 指数|得分|日期|col2|
| - -----|- -----|- -----|- -----|
| 七零六|0.5| 10/31/22 14:45|一个|
| 七零九|0.7| 10/31/22 13:42|一个|
| 七零八|0.7| 10/31/22 15:41|一个|
| 七零六|0.5| 10/31/22 14:45|一个|
| 七零九|0.7| 10/31/22 13:42|一个|
| 七零六|0.5| 10/31/22 14:45|一个|
| 七百零五|0.5| 10/31/22 15:02|一个|
| 七零八|0.7| 10/31/22 15:41|一个|
| 七零八|0.7| 10/31/22 15:41|一个|
| 七零九|0.7| 10/31/22 13:42|一个|
| 七零八|0.7| 10/31/22 15:41|一个|
| 七零九|0.7| 10/31/22 13:42|一个|
| 七零六|0.5| 10/31/22 14:45|一个|
| 七零九|0.7| 10/31/22 13:42|一个|
| 七零九|0.7| 10/31/22 13:42|一个|
| 七零九|0.7| 10/31/22 13:42|一个|
| 七零六|0.5| 10/31/22 14:45|一个|
| 七零六|0.5| 10/31/22 14:45|一个|
| 七百零五|0.5| 10/31/22 15:02|一个|
| 七百零五|0.5| 10/31/22 15:02|一个|
| 七零九|0.7| 10/31/22 13:42| B|
| 七零七|0.5| 10/31/22 15:15| B|
| 七零六|0.5| 10/31/22 14:45| B|
| 七零八|0.7| 10/31/22 15:41| B|
| 七百零五|0.5| 10/31/22 15:02| B|
| 七零八|0.7| 10/31/22 15:41| C类|
| 七零七|0.5| 10/31/22 15:15| C类|
| 七零六|0.5| 10/31/22 14:45| C类|
| 七零七|0.5| 10/31/22 15:15| C类|
| 七零七|0.5| 10/31/22 15:15| C类|
| 七零八|0.7| 10/31/22 15:41| C类|
| 七零八|0.7| 10/31/22 15:41| C类|
| 七零九|0.7| 10/31/22 13:42| C类|
| 七百零五|0.5| 10/31/22 15:02| C类|
| 七零六|0.5| 10/31/22 14:45| C类|
| 七百零五|0.5| 10/31/22 15:02| C类|
| 七零九|0.7| 10/31/22 13:42| C类|
| 七百零五|0.5| 10/31/22 15:02| C类|
| 七零六|0.5| 10/31/22 14:45| C类|
| 七零九|0.7| 10/31/22 13:42| C类|
| 七零八|0.7| 10/31/22 15:41| C类|
| 七零九|0.7| 10/31/22 13:42| C类|
| 七零六|0.5| 10/31/22 14:45| C类|
| 七百零五|0.5| 10/31/22 15:02| C类|
| 七零七|0.5| 10/31/22 15:15| C类|
从它我需要得到最高的价值的基础上,在这种情况下,它将是第一个。我使用spark SQL来创建查询,它已经根据范围的第一天和最后一天的条件来获取最大索引,最大分数和日期。给我最大日期。但是,我需要有max distinct(我知道这可以在常规SQL中完成,但是spark/Pyspark似乎没有可以在SQL查询中使用的等效函数)。
查询如下:

spark.sql("SELECT DISTINCT max(index) AS index, \
                  max(score) AS score, col2, col3,\
                  col4,\
                  max(make_timestamp(last_day(col5))) AS date\
                  FROM table \
                  GROUP BY index,  score,\
                  col3, col4, date").registerTempTable("table1")

如果我使用纯SQL,我可以使用MAXDistinct(),但不支持此函数,它的等效函数是什么?这样我就可以坐第一排了

并且丢弃其余的,因为它们都是相同行的重复,但是由于时间戳,这3列不同。

ybzsozfc

ybzsozfc1#

我不确定我是否理解正确,但根据您的打印,您需要使用Pyspark的最早时间戳行。所以这段代码应该能用

from pyspark.sql import functions as F

df = spark.table("default.csv_stack_csv")  # your table
df = df.withColumn("date_parsed", F.to_timestamp(F.col("date"), "MM/dd/yy HH:mm"))
df = df.sort(F.col("date_parsed")).drop("date_parsed").limit(1)
df.show()

+-----+-----+--------------+
|index|score|          date|
+-----+-----+--------------+
|  709|  0.7|10/31/22 13:42|
+-----+-----+--------------+

相关问题