我在Hive上有一个表,我正在尝试在该表中插入数据。
我正在从SQL中获取数据,但我不想插入Hive表中已经存在的ID。我正在尝试使用不存在的相同条件。我正在Airflow上使用 PySpark 。
答案 0 :(得分:0)
恕我直言,我认为Spark中不存在这样的属性。我认为您可以使用2种方法:
具有UNIQUE
条件(通常是关系数据库)的解决方法:这样,当您尝试以append
模式插入已经存在的记录时,您将获得一个异常。您可以正确处理的。
读取您要写入的表,outer join
将要添加到上述表中的数据,然后将结果写入overwrite mode
(但我认为第一种解决方案的性能可能会更好)。
有关更多详细信息,请随时询问
答案 1 :(得分:0)
Spark中不存在exists
运算符,但是有2个join operators可以代替它:left_anti
和left_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