Join Pyspark:加入2个数据帧以仅从第2个数据帧获取新记录(历史化)

Join Pyspark:加入2个数据帧以仅从第2个数据帧获取新记录(历史化),join,pyspark,pyspark-sql,pyspark-dataframes,Join,Pyspark,Pyspark Sql,Pyspark Dataframes,我有两个数据帧df1和df2。我希望此数据帧的结果如下: 1.获取df1的所有记录。 2.仅从df2中获取新记录(df1中不可用的记录) 3.生成此逻辑的新数据帧 注意:主键是“id”。我只想检查id,而不是完整的行。如果Id在df1中不可用,则仅来自df2的信号装置 df1 +------+-------------+-----+ | id |time |other| +------+-------------+-----+ | 111|

我有两个数据帧df1和df2。我希望此数据帧的结果如下: 1.获取df1的所有记录。 2.仅从df2中获取新记录(df1中不可用的记录) 3.生成此逻辑的新数据帧

注意:主键是“id”。我只想检查id,而不是完整的行。如果Id在df1中不可用,则仅来自df2的信号装置

df1

    +------+-------------+-----+
    |  id  |time         |other|
    +------+-------------+-----+
    |   111|  29-12-2019 |   p1|
    |   222|  29-12-2019 |   p2|
    |   333|  29-12-2019 |   p3|
    +----+-----+-----+---------+
df2

    +------+-------------+-----+
    |  id  |time         |other|
    +------+-------------+-----+
    |   111|  30-12-2019 |   p7|
    |   222|  30-12-2019 |   p8|
    |   444|  30-12-2019 |   p0|
    +----+-----+-----+---------+
结果

+------+-------------+-----+
|  id  |time         |other|
+------+-------------+-----+
|   111|  29-12-2019 |   p1|
|   222|  29-12-2019 |   p2|
|   333|  29-12-2019 |   p3|
|   444|  30-12-2019 |   p0|
+----+-----+-----+---------+

你能帮我在pyspark里怎么做吗。我正计划使用join。

最后我编写了这段代码,它似乎可以很好地处理12000000行,只需5分钟即可构建。我希望它能帮助其他人:

df1=spark.createDataFrame([(111,'29-12-2019','p1'),(222,'29-12-2019','p2'),(333,'29-12-2019','p3')],['id','time','other'])
df2=spark.createDataFrame([(111,'30-12-2019','p7'),(222,'30-12-2019','p8'),(444,'30-12-2019','p0')],['id','time','other'])

mvv1 = df1.select("id").rdd.flatMap(lambda x: x).collect()
print(mvv1)

[111, 222, 333]

yy=",".join([str(x) for x in mvv1])
df2.registerTempTable("temp_df2")
sqlDF2 = sqlContext.sql("select * from temp_df2 where id not in ("+yy+")")
sqlDF2.show()

+---+----------+-----+
| id|      time|other|
+---+----------+-----+
|444|30-12-2019|   p0|
+---+----------+-----+

df1.union(sqlDF2).show()

+---+----------+-----+
| id|      time|other|
+---+----------+-----+
|111|29-12-2019|   p1|
|222|29-12-2019|   p2|
|333|29-12-2019|   p3|
|444|30-12-2019|   p0|
+---+----------+-----+
df1=spark.createDataFrame([(111,'29-12-2019','p1'),(222,'29-12-2019','p2'),(333,'29-12-2019','p3')],['id','time','other'])
df2=spark.createDataFrame([(111,'30-12-2019','p7'),(222,'30-12-2019','p8'),(444,'30-12-2019','p0')],['id','time','other'])

#So this is giving me all records which are not available in df1 dataset
new_input_df = df2.join(df1, on=['id'], how='left_anti')

#Now union df1(historic reocrds) and new_input_df  which contains only new 
final_df = df1.union(new_input_df)

final_df.show()

谢谢你的回答,但我有数以百万计的记录和做工会是造成记忆问题。使用union创建这么多记录要慢一些。join和使用减法或除法如何?join是Spark中最昂贵的操作之一,所以,在执行联接之前尽可能地缩减数据是值得的。我想合并2个表和这么多记录联接的代价可能非常昂贵,所以我使用联接只是为了过滤新记录,并使用UNION作为最终输出。