PySpark:使用另一个数据框插入或更新数据框

时间:2018-08-24 15:17:14

标签: pyspark apache-spark-sql pyspark-sql

我有两个数据帧,DF1和DF2,DF1是主数据,DF2是增量。来自DF2的数据应插入DF1或用于更新DF1数据。解释如下:

假设DF1具有以下格式:

  

id_no |开始日期|金额|天
  --------------------------------------------
  1 | 2016-01-01 | 4650 | 22
  2 | 2016-01-02 | 3130 | 45
  1 | 2016-01-03 | 4456 | 22
  2 | 2016-01-15 | 1234 | 45

DF2包含以下内容:

  

id_no |开始日期|金额|天
  --------------------------------------------
  1 | 2016-01-01 | 8650 | 52
  2 | 2016-01-02 | 7130 | 65
  1 | 2016-01-06 | 3456 | 20
  2 | 2016-01-20 | 2345 | 19
  3 | 2016-02-02 | 1345 | 19

我需要组合两个数据帧,以便如果DF2的“ id_no”和“开始日期”与DF1相匹配,则应在DF1中将其替换,如果不匹配,则应将其插入DF1。 id_no不是唯一的。

结果应为:

  

id_no |开始日期|金额|天
  --------------------------------------------
  1 | 2016-01-01 | 8650 | 52
  2 | 2016-01-02 | 7130 | 65
  1 | 2016-01-03 | 4456 | 22
  2 | 2016-01-15 | 1234 | 45
  1 | 2016-01-06 | 3456 | 20
  2 | 2016-01-20 | 2345 | 19
  3 | 2016-02-02 | 1345 | 19

请有人建议我如何解决这个问题。

2 个答案:

答案 0 :(得分:2)

您可以将s = df2["A"] result = s.str.extractall(r"(\d+/\d+/\d+)")[0] print(result) >>> match 0 0 10/01/2016 1 31/10/18 4 0 10/01/2016 5 0 02/20/2017 id_no上的两个数据框连接在一起,然后将start_datecoalesce列中的amount与{{1}中的列连接在一起}首先:

days

如果您还有更多列:

df2

答案 1 :(得分:0)

如果两个 dfs 的结构相同,则

union 应该这样做。

from pyspark.sql import functions as F
grp_by = {'id_no', 'start_date'}
df = df2.union(df1)
df = df.groupby(*grp_by).agg(*[F.first(c).alias(c) for c in set(df.columns)-grp_by])
df.show()
#     +-----+----------+----+------+
#     |id_no|start_date|days|amount|
#     +-----+----------+----+------+
#     |    1|2016-01-06|  20|  3456|
#     |    2|2016-01-20|  19|  2345|
#     |    1|2016-01-03|  22|  4456|
#     |    3|2016-02-02|  19|  1345|
#     |    2|2016-01-15|  45|  1234|
#     |    1|2016-01-01|  52|  8650|
#     |    2|2016-01-02|  65|  7130|
#     +-----+----------+----+------+