如何将每日水平的值填充到数据框而不是null

时间:2018-08-27 08:10:27

标签: python pyspark

我有一个pyspark数据框,其中包含如图所示的列

Unique_id        date                type

1          2018-03-21 12:05:31        a
1          2018-03-21 12:05:32        None
1          2018-03-21 12:05:33        None
1          2018-03-21 12:05:34        None
1          2018-03-21 12:05:35        None
1          2018-03-21 12:05:36        None
1          2018-03-21 12:05:37        None
2          2018-03-21 12:05:31        b
2          2018-03-21 12:05:32        None
2          2018-03-21 12:05:33        None
2          2018-03-21 12:05:34        None

现在,类型可以在某些天后更改,但不能在同一天更改。我要达到的目的并且无法弄清楚该怎么做,就是获取每天收到一次的值,然后用该值填充当天收到的所有值。谁能帮我吗?

2 个答案:

答案 0 :(得分:0)

我将使用Spark Window解决此类问题。假设每天只有一行,其中type不为null:

from pyspark.sql import functions as F
from pyspark.sql import Window    

df = sqlContext.createDataFrame([ 
    [(1),('2018-03-21 12:25:01'), ('a')],
    [(1),('2018-03-21 12:25:02'), (None)],
    [(1),('2018-03-22 12:25:03'), ('b')],
    [(1),('2018-03-22 12:25:04'), (None)],
    [(2),('2018-03-21 12:25:01'), ('c')],
    [(2),('2018-03-21 12:25:02'), (None)],
    [(2),('2018-03-21 12:25:03'), (None)],
], ['id', 'date', 'type'])

df2 = df.select('*', F.to_date('date', 'yyyy-MM-dd HH:mm:ss').alias('date2'))

windowSpec = Window.partitionBy('id', 'date2')
typee = F.max('type').over(windowSpec)

df3 = df2.select('id', 'date', typee.alias('type'))
df3.show()
>>>
+---+-------------------+----+
| id|               date|type|
+---+-------------------+----+
|  2|2018-03-21 12:25:01|   c|
|  2|2018-03-21 12:25:02|   c|
|  2|2018-03-21 12:25:03|   c|
|  1|2018-03-22 12:25:03|   b|
|  1|2018-03-22 12:25:04|   b|
|  1|2018-03-21 12:25:01|   a|
|  1|2018-03-21 12:25:02|   a|
+---+-------------------+----+

答案 1 :(得分:0)

根据以上答案进行研究后,我自己的尝试和错误通过正向填充特别针对我的问题找到了合适的解决方案。