如何在pyspark中使用“不存在的地方” SQL条件?

时间:2019-02-06 09:21:06

标签: python hive pyspark airflow pyspark-sql

我在Hive上有一个表,我正在尝试在该表中插入数据。
我正在从SQL中获取数据,但我不想插入Hive表中已经存在的ID。我正在尝试使用不存在的相同条件。我正在Airflow上使用 PySpark

3 个答案:

答案 0 :(得分:0)

恕我直言,我认为Spark中不存在这样的属性。我认为您可以使用2种方法:

  1. 具有UNIQUE条件(通常是关系数据库)的解决方法:这样,当您尝试以append模式插入已经存在的记录时,您将获得一个异常。您可以正确处理的。

  2. 读取您要写入的表,outer join将要添加到上述表中的数据,然后将结果写入overwrite mode(但我认为第一种解决方案的性能可能会更好)。

有关更多详细信息,请随时询问

答案 1 :(得分:0)

Spark中不存在exists运算符,但是有2个join operators可以代替它:left_antileft_semi

例如,如果要在配置单元表df中插入数据帧target,则可以执行以下操作:

new_df = df.join(
    spark.table("target"),
    how='left_anti',
    on='id'
)

然后将new_df写在表中。

left_anti仅允许保留不符合连接条件的行(相当于not exists)。与exists等效的是left_semi

答案 2 :(得分:0)

您可以通过临时视图在数据帧上直接使用 Spark SQL 使用 not exist

table_withNull_df.createOrReplaceTempView("table_withNull")
tblA_NoNull_df.createOrReplaceTempView("tblA_NoNull")

result_df = spark.sql("""
select * from table_withNull 
where not exists 
(select 1 from 
tblA_NoNull 
where table_withNull.id = tblA_NoNull.id)
""")

这种方法比左反加入更可取,因为它们会导致意外的 BroadcastNestedLoopJoin 导致广播超时(即使在反加入中没有明确请求广播)。

之后,您可以执行 write.mode("append") 插入以前未遇到的数据。

示例取自 here