У меня есть фрейм данных pyspark
deviceId timestamp
009eeb 2024-04-22
009eeb 2024-04-24
7c002v 2024-04-20
7c002v null
4fd556 null
4fd556 null
Мне нужно получить максимальную временную метку в конечном кадре данных и удалить дубликаты. Я попробовал использовать приведенный ниже код
w = Window.partitionBy('deviceId')
df_max = df.withColumn('max_col', F.max('timestamp').over(w))\
.where((F.col('timestamp') == F.col('max_col')) | (F.col('timestamp').isNull()))
.dropDuplicates()
Но из этого кода я получаю то, что мне нужно.
deviceId timestamp
009eeb 2024-04-24
7c002v null
4fd556 null
4fd556 null
Мне нужно получить результат, как показано ниже
deviceId timestamp
009eeb 2024-04-24
7c002v 2024-04-20
4fd556 null
Пожалуйста, предложите внести какие-либо изменения
Просто используйте функцию max
напрямую.
from pyspark.sql import SparkSession, functions as F
spark = SparkSession.builder.enableHiveSupport().getOrCreate()
data = [
('009eeb', '2024-04-22'),
('009eeb', '2024-04-24'),
('7c002v', '2024-04-20'),
('7c002v', None),
('4fd556', None),
('4fd556', None),
]
df = spark.createDataFrame(data, ['deviceId', 'timestamp'])
df = df.groupBy('deviceId').agg(F.max('timestamp').alias('timestamp'))
df.show(truncate=False)
# +--------+----------+
# |deviceId|timestamp |
# +--------+----------+
# |009eeb |2024-04-24|
# |4fd556 |null |
# |7c002v |2024-04-20|
# +--------+----------+
О какой ошибке вы там сообщили? Полный фрагмент программы аналогичен приведенному выше.
Это не работает. Можете ли вы показать на примере