Pyspark - 在pyspark中创建等效的业务当前视图

问题描述 投票:0回答:1

我需要在pyspark中创建一个等效的业务当前视图,我有一个历史文件和一个增量文件(包含id和日期)。我需要创建最终的数据帧,它将包含每个id的单个记录,该记录应该是最新日期。

df1=sql_context.createDataFrame([("3000", "2017-04-19"), ("5000", "2017-04-19"), ("9012", "2017-04-19")], ["id", "date"])
df2=sql_context.createDataFrame([("3000", "2017-04-18"), ("5120", "2017-04-18"), ("1012", "2017-04-18")], ["id", "date"])

DF3 = df2.union(DF1).distinct()

+----+----------+
|  id|      date|
+----+----------+
|3000|2017-04-19|
|3000|2017-04-18|
|5120|2017-04-18|
|5000|2017-04-19|
|1012|2017-04-18|
|9012|2017-04-19|

+----+----------+

我尝试做一个联盟并做一个独特的,它给了我id = 3000的日期,因为我只需要记录id = 300 for date = 2017-04-19

即使减去也不起作用,因为它返回任何一个df的所有行。

期望的输出: -

+----+----------+
|  id|      date|
+----+----------+
|3000|2017-04-19|
|
|5120|2017-04-18|
|5000|2017-04-19|
|1012|2017-04-18|
|9012|2017-04-19|
+----+----------+
pyspark pyspark-sql
1个回答
0
投票

希望这可以帮助!

from pyspark.sql.functions import unix_timestamp, col, to_date, max

#sample data
df1=sqlContext.createDataFrame([("3000", "2017-04-19"),
                                ("5000", "2017-04-19"),
                                ("9012", "2017-04-19")],
                               ["id", "date"])
df2=sqlContext.createDataFrame([("3000", "2017-04-18"),
                                ("5120", "2017-04-18"),
                                ("1012", "2017-04-18")],
                               ["id", "date"])
df=df2.union(df1)
df.show()

#convert 'date' column to date type so that latest date can be fetched for an ID
df = df.\
    withColumn('date_inDateFormat',to_date(unix_timestamp(col('date'),"yyyy-MM-dd").cast("timestamp"))).\
    drop('date')

#get latest date for an ID
df = df.groupBy('id').agg(max('date_inDateFormat').alias('date'))
df.show()

输出是:

+----+----------+
|  id|      date|
+----+----------+
|5000|2017-04-19|
|1012|2017-04-18|
|5120|2017-04-18|
|9012|2017-04-19|
|3000|2017-04-19|
+----+----------+

注意:如果答案可以帮助您解决问题,请不要忘记let SO know

© www.soinside.com 2019 - 2024. All rights reserved.