更新三角洲湖表模式<一個class="headerlink" href="//www.eheci.com/docs/delta/#update-delta-lake-table-schema" title="">

三角洲湖允許您更新一個表的模式。支持以下類型的變化:

  • 添加新列(在任意位置)

  • 重新安排現有的列

  • 重命名現有列

你可以讓這些變化顯式或隱式地使用DML使用DDL。

重要的

當你更新一個δ表模式,流讀取該表的終止。如果你想繼續流必須重新啟動它。

推薦的方法,請參閱<一個class="reference internal" href="//www.eheci.com/docs/docs/structured-streaming/production.html">生產注意事項結構化流

顯式地添加列更新模式<一個class="headerlink" href="//www.eheci.com/docs/delta/#explicitly-update-schema-to-add-columns" title="">

改變table_name添加(col_namedata_type(評論col_comment](第一個|colA_name),…)

默認情況下,nullability真正的

添加一個列到嵌套,使用:

改變table_name添加(col_namenested_col_namedata_type(評論col_comment](第一個|colA_name),…)

例如,如果之前的模式運行改變盒子添加(colB.nested字符串field1)是:

- - - - - -|- - - - - -可樂|- - - - - -colB|+ -field1|+ -field2

後的模式是:

- - - - - -|- - - - - -可樂|- - - - - -colB|+ -field1|+ -嵌套的|+ -field2

請注意

添加嵌套列支持結構。不支持數組和地圖。

顯式地更新模式改變列的評論或訂購<一個class="headerlink" href="//www.eheci.com/docs/delta/#explicitly-update-schema-to-change-column-comment-or-ordering" title="">

改變table_name改變(]col_namecol_namedata_type(評論col_comment](第一個|colA_name]

改變一個列在一個嵌套的領域,使用:

改變table_name改變(]col_namenested_col_namenested_col_namedata_type(評論col_comment](第一個|colA_name]

例如,如果之前的模式運行改變盒子改變colB.field2field2字符串第一個是:

- - - - - -|- - - - - -可樂|- - - - - -colB|+ -field1|+ -field2

後的模式是:

- - - - - -|- - - - - -可樂|- - - - - -colB|+ -field2|+ -field1

明確更新模式來取代列<一個class="headerlink" href="//www.eheci.com/docs/delta/#explicitly-update-schema-to-replace-columns" title="">

改變table_name取代(col_name1col_type1(評論col_comment1),…)

例如,當運行以下DDL:

改變盒子取代(colC字符串,colB結構體<field2:字符串,嵌套的:字符串,field1:字符串>,可樂字符串)

如果之前的模式是:

- - - - - -|- - - - - -可樂|- - - - - -colB|+ -field1|+ -field2

後的模式是:

- - - - - -|- - - - - -colC|- - - - - -colB|+ -field2|+ -嵌套的|+ -field1|- - - - - -可樂

重命名列明確的更新模式<一個class="headerlink" href="//www.eheci.com/docs/delta/#explicitly-update-schema-to-rename-columns" title="">

預覽

這個特性是在<一個class="reference internal" href="//www.eheci.com/docs/docs/release-notes/release-types.html">公共預覽

請注意

這個特性可以在磚運行時10.2及以上。

重命名列不重寫任何列的現有數據,您必須啟用列映射表。看到<一個class="reference internal" href="//www.eheci.com/docs/docs/delta/delta-column-mapping.html">列映射在磚

重命名一個列:

改變table_name重命名old_col_namenew_col_name

重命名一個嵌套的字段:

改變table_name重命名col_nameold_nested_fieldnew_nested_field

例如,當您運行以下命令:

改變盒子重命名colBfield1field001

如果之前的模式是:

- - - - - -|- - - - - -可樂|- - - - - -colB|+ -field1|+ -field2

之後的模式是:

- - - - - -|- - - - - -可樂|- - - - - -colB|+ -field001|+ -field2

看到<一個class="reference internal" href="//www.eheci.com/docs/docs/delta/delta-column-mapping.html">列映射在磚

明確更新模式刪除列<一個class="headerlink" href="//www.eheci.com/docs/delta/#explicitly-update-schema-to-drop-columns" title="">

預覽

這個特性是在<一個class="reference internal" href="//www.eheci.com/docs/docs/release-notes/release-types.html">公共預覽

請注意

這個特性可以在磚運行時11.0及以上。

刪除列僅元數據操作,而無需重新編寫任何數據文件,您必須啟用列映射表。看到<一個class="reference internal" href="//www.eheci.com/docs/docs/delta/delta-column-mapping.html">列映射在磚

重要的

刪除一列從元數據不會刪除列的底層數據文件。清除掉列數據,您可以使用<一個class="reference internal" href="//www.eheci.com/docs/docs/sql/language-manual/delta-reorg-table.html">REORG表修改文件。然後,您可以使用<一個class="reference internal" href="//www.eheci.com/docs/docs/sql/language-manual/delta-vacuum.html">真空物理上刪除的文件包含了列數據。

放棄一個列:

改變table_name下降col_name

將多個列:

改變table_name下降(col_name_1,col_name_2)

明確更新模式改變列類型或名稱<一個class="headerlink" href="//www.eheci.com/docs/delta/#explicitly-update-schema-to-change-column-type-or-name" title="">

你可以改變一個列的類型或名稱或刪除表通過重寫一列。要做到這一點,使用overwriteSchema選擇。

下麵的例子顯示了更改列類型:

(火花()withColumn(“生日”,上校(“生日”)(“日期”))模式(“覆蓋”)選項(“overwriteSchema”,“真正的”)saveAsTable())

下麵的例子展示了更改列的名字:

(火花()withColumnRenamed(“dateOfBirth”,“生日”)模式(“覆蓋”)選項(“overwriteSchema”,“真正的”)saveAsTable())

添加列自動模式更新<一個class="headerlink" href="//www.eheci.com/docs/delta/#add-columns-with-automatic-schema-update" title="">

列中DataFrame但失蹤從表中自動添加時寫事務的一部分:

  • writeStream.option (“mergeSchema”,“真正的”)

  • spark.databricks.delta.schema.autoMerge.enabled真正的

當指定兩個選項,選擇從DataFrameWriter優先。添加的列是附加到他們存在的結構。當添加一個新的列保存。

請注意

  • mergeSchema不能用於插入.write.insertInto ()

自動模式演化為三角洲湖合並<一個class="headerlink" href="//www.eheci.com/docs/delta/#automatic-schema-evolution-for-delta-lake-merge" title="">

默認情況下,updateAllinsertAll指定目標三角洲表中的所有列和列名稱相同的源數據集。任何列在源數據集不匹配目標表中的列將被忽略。但是,在某些用例,需要自動添加源列到目標差值表。

自動更新在表模式合並操作updateAllinsertAll(至少一個),您可以設置引發會話配置spark.databricks.delta.schema.autoMerge.enabled真正的在運行之前合並操作。

請注意

  • 模式演化發生隻有當有一個updateAll(更新*)或一個insertAll(插入*)行動,或兩者兼而有之。

  • 更新插入行動不能顯式地引用目標列不已經存在於目標表(即使它有updateAllinsertAll的條款)。請參見下麵的示例。

請注意

在磚運行時7.4及以下,合並隻支持模式演化的頂級列,而不是嵌套的列。

這裏有一些例子的影響合並操作,沒有模式演化。

查詢(在Scala中)

行為沒有模式演化(默認)

行為模式演化

目標列:鍵,價值

源列:鍵,值,newValue

targetDeltaTable別名(“t”)合並(sourceDataFrame別名(“s”),“t。關鍵= s.key”)whenMatched()。updateAll()whenNotMatched()。insertAll()執行()

表模式保持不變;隻列關鍵,價值更新/插入。

表模式改變(關鍵值,newValue)updateAll更新列價值newValue,insertAll插入行(關鍵值,newValue)

目標列:鍵,oldValue

源列:鍵,newValue

targetDeltaTable別名(“t”)合並(sourceDataFrame別名(“s”),“t。關鍵= s.key”)whenMatched()。updateAll()whenNotMatched()。insertAll()執行()

updateAllinsertAll因為目標列行動拋出一個錯誤oldValue不是在源。

表模式改變(關鍵oldValue,newValue)updateAll更新列關鍵newValue離開oldValue保持不變,insertAll插入行(關鍵空,newValue)(即,oldValue是插入)。

目標列:鍵,oldValue

源列:鍵,newValue

targetDeltaTable別名(“t”)合並(sourceDataFrame別名(“s”),“t。關鍵= s.key”)whenMatched()。更新(地圖(“newValue”- >上校(“s.newValue”)))whenNotMatched()。insertAll()執行()

更新拋出一個錯誤,因為列newValue目標表中不存在。

更新因為列仍拋出一個錯誤newValue目標表中不存在。

目標列:鍵,oldValue

源列:鍵,newValue

targetDeltaTable別名(“t”)合並(sourceDataFrame別名(“s”),“t。關鍵= s.key”)whenMatched()。updateAll()whenNotMatched()。插入(地圖(“關鍵”- >上校(“s.key”),“newValue”- >上校(“s.newValue”)))執行()

插入拋出一個錯誤,因為列newValue目標表中不存在。

插入列仍然拋出一個錯誤newValue目標表中不存在。

自動模式演化結構體的數組<一個class="headerlink" href="//www.eheci.com/docs/delta/#automatic-schema-evolution-for-arrays-of-structs" title="">

δ合並支持解決結構體字段為結構體數組的名字和發展模式。啟用模式演化後,目標表模式將為陣列結構的進化,也適用於任何嵌套的結構體數組的內部。

請注意

這個特性可以在磚運行時9.1及以上。磚運行時的9.0及以下,隱式火花鑄造用於數組結構來解決結構體字段的位置,和合並操作的影響,沒有模式演化的結構體數組與以外的結構體數組的行為不一致。

這裏有一些例子的合並操作的影響,沒有模式演化的結構體數組。

源模式

目標模式

行為沒有模式演化(默認)

行為模式演化

數組< struct < b:字符串,答:string > >

<結構體數組< int, b: int > >

表模式保持不變。列將解決名稱和更新或插入。

表模式保持不變。列將解決名稱和更新或插入。

數組< struct < int, c:字符串,d: string > >

<結構體數組<字符串,b: string > >

更新插入把錯誤是因為cd目標表中不存在。

表模式更改為數組< struct <字符串,b:字符串,c:字符串,d: string > >。cd是插入現有條目的目標表。更新插入源表中的條目填充一個字符串和轉化b作為

數組< struct <字符串,b: struct < c:字符串,d: string > > >

數組< struct <字符串,b: struct < c: string > > >

更新插入把錯誤是因為d目標表中不存在。

目標表模式更改為數組< struct <字符串,b: struct < c:字符串,d: string > > >。d是插入現有條目的目標表。

處理NullType列模式更新<一個class="headerlink" href="//www.eheci.com/docs/delta/#dealing-with-nulltype-columns-in-schema-updates" title="">

因為拚花不支持NullType,NullType列從DataFrame當編寫成三角洲表下降,但仍存儲在模式。當接收到一個不同的數據類型列,三角洲湖合並到新數據類型的模式。如果δ收到一個湖NullType對於一個已有的列,保留舊模式和新列是在寫了。

NullType在不支持流媒體。因為使用流媒體時必須設置模式這應該是非常罕見的。NullType也不接受等複雜類型ArrayTypeMapType

替換表模式<一個class="headerlink" href="//www.eheci.com/docs/delta/#replace-table-schema" title="">

默認情況下,覆蓋一個表中的數據不會覆蓋模式。當覆蓋表使用模式(“覆蓋”)沒有replaceWhere,您可能還想覆蓋寫入數據的模式。你替換的模式和分區表通過設置overwriteSchema選項真正的:

df選項(“overwriteSchema”,“真正的”)