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

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

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

  • 重新安排現有的列

  • 重命名現有列

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

重要的

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

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

顯式地添加列更新模式<一個class="headerlink" href="//m.eheci.com/docs.gcp/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="//m.eheci.com/docs.gcp/delta/#explicitly-update-schema-to-change-column-comment-or-ordering" title="">

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

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

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

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

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

後的模式是:

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

明確更新模式來取代列<一個class="headerlink" href="//m.eheci.com/docs.gcp/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="//m.eheci.com/docs.gcp/delta/#explicitly-update-schema-to-rename-columns" title="">

預覽

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

請注意

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

重命名列不重寫任何列的現有數據,您必須啟用列映射表。看到<一個class="reference internal" href="//m.eheci.com/docs.gcp/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="//m.eheci.com/docs.gcp/delta/delta-column-mapping.html">重命名和刪除列與三角洲湖列映射

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

預覽

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

請注意

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

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

重要的

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

放棄一個列:

改變table_name下降col_name

將多個列:

改變table_name下降(col_name_1,col_name_2)

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

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

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

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

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

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

添加列自動模式更新<一個class="headerlink" href="//m.eheci.com/docs.gcp/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="//m.eheci.com/docs.gcp/delta/#automatic-schema-evolution-for-delta-lake-merge" title="">

模式演化允許用戶解決模式不匹配的目標和源表合並。它處理以下兩種情況:

  1. 源表中的一列目標表中不存在。新列添加到目標模式,和它的值插入或更新使用源值。

  2. 目標表中的一列源表中不存在。目標模式是不變的;額外的目標列中的值不變(更新)或一組(插入)。

重要的

使用模式演化,你必須設置會話配置'spark.databricks.delta.schema.autoMerge.enabled火花”真正的在你運行合並命令。

請注意

  • 在磚LTS 7.3運行時,合並隻支持模式演化的頂級列,而不是嵌套的列。

  • 磚運行時的12.2及以上,可以指定列出現在源表的名字在插入或更新操作。在磚12.1運行時,下麵的,隻有插入*更新*行動可以用於模式演化與合並。

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

在SQL查詢()

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

行為模式演化

目標列:鍵,價值

源列:鍵,值,new_value

合並target_tablet使用source_table年代t關鍵=年代關鍵匹配然後更新*匹配然後插入*

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

表模式改變(關鍵值,new_value)。與匹配更新現有的記錄價值new_value在源。新行插入模式(關鍵值,new_value)

目標列:鍵,old_value

源列:鍵,new_value

合並target_tablet使用source_table年代t關鍵=年代關鍵匹配然後更新*匹配然後插入*

更新插入因為目標列行動拋出一個錯誤old_value不是在源。

表模式改變(關鍵old_value,new_value)。與匹配更新現有的記錄new_value在源離開old_value不變。新記錄插入指定的關鍵,new_value,old_value

目標列:鍵,old_value

源列:鍵,new_value

合並target_tablet使用source_table年代t關鍵=年代關鍵匹配然後更新new_value=年代new_value

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

表模式改變(關鍵old_value,new_value)。與匹配更新現有的記錄new_value在源離開old_value不變,和無與倫比的記錄參加了new_value。看到的請注意<一個class="reference internal" href="//m.eheci.com/docs.gcp/delta/#1">(1)

目標列:鍵,old_value

源列:鍵,new_value

合並target_tablet使用source_table年代t關鍵=年代關鍵匹配然後插入(關鍵,new_value)(年代關鍵,年代new_value)

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

表模式改變(關鍵old_value,new_value)。新記錄插入指定的關鍵,new_value,old_value。現有的記錄參加了new_value離開old_value不變。看到的請注意<一個class="reference internal" href="//m.eheci.com/docs.gcp/delta/#1">(1)

(1)這種行為可以在磚運行時12.2及以上;在這種情況下磚12.1運行時,下麵的錯誤。

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

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

請注意

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

  • 在磚運行時的12.2及以上,可以指定結構體字段出現在源表的名字在insert或update命令。在磚12.1運行時,下麵的,隻有插入*更新*命令可用於模式演化與合並。

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

源模式

目標模式

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

行為模式演化

數組< 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="//m.eheci.com/docs.gcp/delta/#dealing-with-nulltype-columns-in-schema-updates" title="">

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

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

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

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

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

重要的

你不能指定overwriteSchema作為真正的當使用動態分區覆蓋。