Получить отдельные строки по дате создания - PullRequest
0 голосов
/ 16 мая 2019

Я работаю с таким фреймом данных:

DeviceNumber        | CreationDate       | Name
1001                | 1.1.2018           | Testdevice
1001                | 30.06.2019         | Device
1002                | 1.1.2019           | Lamp

Я использую блоки данных и pyspark для выполнения процесса ETL.Как я могу уменьшить фрейм данных таким образом, чтобы у меня был только один ряд на «DeviceNumber» и чтобы это была строка с самым высоким «CreationDate»?В этом примере я хочу, чтобы результат выглядел так:

DeviceNumber        | CreationDate       | Name
1001                | 30.06.2019         | Device
1002                | 1.1.2019           | Lamp

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Вы можете создать дополнительный фрейм данных с DeviceNumber и его последней / max CreationDate.

import pyspark.sql.functions as psf

max_df = df\
    .groupBy('DeviceNumber')\
    .agg(psf.max('CreationDate').alias('max_CreationDate'))

, а затем присоедините max_df к исходному фрейму данных.

joining_condition = [ df.DeviceNumber == max_df.DeviceNumber, df.CreationDate == max_df.max_CreationDate ]

df.join(max_df,joining_condition,'left_semi').show()

left_semi объединение полезно, когда вам нужен второй кадр данных для поиска, и ему нужен какой-либо столбец из второго блока данных.

0 голосов
/ 16 мая 2019

Вы можете использовать функциональность окон PySpark:

from pyspark.sql.window import Window
from pyspark.sql import functions as f

# make sure that creation is a date data-type
df = df.withColumn('CreationDate', f.to_timestamp('CreationDate', format='dd.MM.yyyy'))

# partition on device and get a row number by (descending) date
win = Window.partitionBy('DeviceNumber').orderBy(f.col('CreationDate').desc())
df = df.withColumn('rownum', f.row_number().over(win))

# finally take the first row in each group
df.filter(df['rownum']==1).select('DeviceNumber', 'CreationDate', 'Name').show()

------------+------------+------+
|DeviceNumber|CreationDate|  Name|
+------------+------------+------+
|        1002|  2019-01-01|  Lamp|
|        1001|  2019-06-30|Device|
+------------+------------+------+
...