磚運行時: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和倍增式合並不兼容的數據類型
我會期待一個異常提高無論寫命令,為什麼不這樣呢?
嗨@Sigrun Nordli,你是正確的,你觀察到的行為並不直觀。然而,這種行為是由於三角洲湖的合並操作的工作方式與類型強製規則在Apache引發™。當你使用合並,三角洲湖的合並操作執行更新插入(更新或插入),而不是傳統的插入。這個手術本身就涉及了比較列來決定哪些行需要更新,應該插入,應該離開。
在你的案例中,比較目標。c1 = source.c1。在執行這個操作,Apache火花™類型強製規則發揮作用。這些規則試圖調和的差異類型的比較成為可能。火花默默地將整型轉換為雙操作在你的情況中。轉換是可能的,沒有精度損失。因此不例外。
然而,當您使用傳統的插入操作,引發預期的源和目標數據幀模式匹配精確。如果有不匹配的類型,它拋出AnalysisException,正如您所觀察到的。
所以回答你的問題,行為的差異是由於合並操作處理類型不匹配不同的插入操作。這個結果從三角洲湖的合並操作和Apache火花™類型強製規則。
然而,如果你想要執行嚴格的模式檢查在使用合並之前,您必須手動實現它們在代碼執行合並操作。