簡體   English   中英

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

[英]How can I use "where not exists" SQL condition in pyspark?

我在 Hive 上有一張表,我正在嘗試在該表中插入數據。
我正在從 SQL 獲取數據,但我不想插入 Hive 表中已經存在的 id。 我試圖使用相同的條件,如不存在的地方。 我在 Airflow 上使用PySpark

exists運算符在 Spark 中不存在,但有 2 個連接運算符可以替換它: left_antileft_semi

例如,如果您想在 hive 表target插入數據幀df ,您可以執行以下操作:

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

然后你在你的表中寫入new_df

left_anti允許您只保留不滿足連接條件的行(相當於not exists )。 exists的等價物是left_semi

您可以通過臨時視圖在數據幀上使用 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")以插入以前未遇到的數據。

示例取自此處

恕我直言,我認為 Spark 中不存在這樣的屬性。 我認為您可以使用兩種方法:

  1. UNIQUE條件(關系數據庫的典型特征)的解決方法:這樣,當您嘗試插入(以append模式)已經存在的記錄時,您將得到一個可以正確處理的異常。

  2. 讀取要寫入的表,將其與要添加到上述表中的數據進行outer join ,然后以overwrite mode寫入結果(但我認為第一種解決方案在性能上可能更好)。

欲了解更多詳情,請隨時詢問

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM