[英]How can I use "where not exists" SQL condition in pyspark?
我在 Hive 上有一張表,我正在嘗試在該表中插入數據。
我正在從 SQL 獲取數據,但我不想插入 Hive 表中已經存在的 id。 我試圖使用相同的條件,如不存在的地方。 我在 Airflow 上使用PySpark 。
exists
運算符在 Spark 中不存在,但有 2 個連接運算符可以替換它: left_anti
和left_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 中不存在這樣的屬性。 我認為您可以使用兩種方法:
UNIQUE
條件(關系數據庫的典型特征)的解決方法:這樣,當您嘗試插入(以append
模式)已經存在的記錄時,您將得到一個可以正確處理的異常。
讀取要寫入的表,將其與要添加到上述表中的數據進行outer join
,然后以overwrite mode
寫入結果(但我認為第一種解決方案在性能上可能更好)。
欲了解更多詳情,請隨時詢問
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.