取消
顯示的結果
而不是尋找
你的意思是:

三角洲湖模式執行允許數據類型不匹配在寫使用合並操作(python)

signo
新的貢獻者二世

磚運行時:12.2 LTS,火花:3.3.2,三角洲湖:2.2.0

目標表和模式([c1:整數,c2:整數]),允許我們使用數據和模式寫入目標表([c1:整數,c2:雙])。我預計它拋出一個異常(一樣使用正常火花寫插入操作),而是它存儲的數據不匹配的數據類型字段c2。

從pyspark.sql。類型進口StructType、StructField IntegerType,倍增式三角洲進口DeltaTable #源數據模式= StructType ([StructField (c1, IntegerType(),假),StructField (c2,倍增式(),假)])rdd_output = spark.sparkContext。並行化([(4,1.4),(5.0),(3.5 6),])df_source =火花。createDataFrame (rdd_output模式=)#寫使用合並target_table = DeltaTable源到目標表。forName(火花,“default.test_datatype_misalignment”)合並= target_table.alias(“目標”).merge (df_source.alias(“源”)”的目標。.whenNotMatchedInsertAll c1 = source.c1”) merge.whenMatchedUpdateAll () () . execute () spark.table (“default.test_datatype_misalignment”),告訴()#輸出# + - - - + - - - + # | c1 | c2 | # + - - - + - - - + # | 1 | 1 | # | 2 | 1 | # | 3 | 5 | # | 4 | 1 | # | 5 | 5 | # | 6 | 3 | # + - - - + - - - + #寫源使用插入目標表df_source.write.format .mode(“δ”)(“追加”).saveAsTable輸出(default.test_datatype_misalignment) # # AnalysisException:未能合並字段c2和c2。未能IntegerType和倍增式合並不兼容的數據類型

我會期待一個異常提高無論寫命令,為什麼不這樣呢?

3回複3

werners1
尊敬的貢獻者三世

也許啟用模式演化?

Kaniz
社區經理
社區經理

嗨@Sigrun Nordli,你是正確的,你觀察到的行為並不直觀。然而,這種行為是由於三角洲湖的合並操作的工作方式與類型強製規則在Apache引發™。當你使用合並,三角洲湖的合並操作執行更新插入(更新或插入),而不是傳統的插入。這個手術本身就涉及了比較列來決定哪些行需要更新,應該插入,應該離開。

在你的案例中,比較目標。c1 = source.c1。在執行這個操作,Apache火花™類型強製規則發揮作用。這些規則試圖調和的差異類型的比較成為可能。火花默默地將整型轉換為雙操作在你的情況中。轉換是可能的,沒有精度損失。因此不例外。

然而,當您使用傳統的插入操作,引發預期的源和目標數據幀模式匹配精確。如果有不匹配的類型,它拋出AnalysisException,正如您所觀察到的。

所以回答你的問題,行為的差異是由於合並操作處理類型不匹配不同的插入操作。這個結果從三角洲湖的合並操作和Apache火花™類型強製規則。

然而,如果你想要執行嚴格的模式檢查在使用合並之前,您必須手動實現它們在代碼執行合並操作。

Vidula_Khanna
主持人
主持人

嗨@Sigrun Nordli

謝謝你發布你的問題在我們的社區!我們很高興幫助你。

幫助我們為您提供最準確的信息,請您花一些時間來回顧反應和選擇一個最好的回答了你的問題嗎?

這也將有助於其他社區成員可能也有類似的問題在未來。謝謝你的參與,讓我們知道如果你需要任何進一步的援助!

歡迎來到磚社區:讓學習、網絡和一起慶祝

加入我們的快速增長的數據專業人員和專家的80 k +社區成員,準備發現,幫助和合作而做出有意義的聯係。

點擊在這裏注冊今天,加入!

參與令人興奮的技術討論,加入一個組與你的同事和滿足我們的成員。

Baidu
map