更新三角洲湖表模式<一個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_name。nested_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_name。nested_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_name來new_col_name
重命名一個嵌套的字段:
改變表table_name重命名列col_name。old_nested_field來new_nested_field
例如,當您運行以下命令:
改變表盒子重命名列colB。field1來field001
如果之前的模式是:
- - - - - -根|- - - - - -可樂|- - - - - -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="">
默認情況下,updateAll
和insertAll
指定目標三角洲表中的所有列和列名稱相同的源數據集。任何列在源數據集不匹配目標表中的列將被忽略。但是,在某些用例,需要自動添加源列到目標差值表。
自動更新在表模式合並
操作updateAll
和insertAll
(至少一個),您可以設置引發會話配置spark.databricks.delta.schema.autoMerge.enabled
來真正的
在運行之前合並
操作。
請注意
模式演化發生隻有當有一個
updateAll
(更新集*
)或一個insertAll
(插入*
)行動,或兩者兼而有之。更新
和插入
行動不能顯式地引用目標列不已經存在於目標表(即使它有updateAll
或insertAll
的條款)。請參見下麵的示例。
請注意
在磚運行時7.4及以下,合並
隻支持模式演化的頂級列,而不是嵌套的列。
這裏有一些例子的影響合並
操作,沒有模式演化。
列 |
查詢(在Scala中) |
行為沒有模式演化(默認) |
行為模式演化 |
---|---|---|---|
目標列: 源列: |
targetDeltaTable。別名(“t”)。合並(sourceDataFrame。別名(“s”),“t。關鍵= s.key”)。whenMatched()。updateAll()。whenNotMatched()。insertAll()。執行()
|
表模式保持不變;隻列 |
表模式改變 |
目標列: 源列: |
targetDeltaTable。別名(“t”)。合並(sourceDataFrame。別名(“s”),“t。關鍵= s.key”)。whenMatched()。updateAll()。whenNotMatched()。insertAll()。執行()
|
|
表模式改變 |
目標列: 源列: |
targetDeltaTable。別名(“t”)。合並(sourceDataFrame。別名(“s”),“t。關鍵= s.key”)。whenMatched()。更新(地圖(“newValue”- >上校(“s.newValue”)))。whenNotMatched()。insertAll()。執行()
|
|
|
目標列: 源列: |
targetDeltaTable。別名(“t”)。合並(sourceDataFrame。別名(“s”),“t。關鍵= s.key”)。whenMatched()。updateAll()。whenNotMatched()。插入(地圖(“關鍵”- >上校(“s.key”),“newValue”- >上校(“s.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 > > |
|
表模式更改為數組< struct <字符串,b:字符串,c:字符串,d: string > >。 |
數組< struct <字符串,b: struct < c:字符串,d: string > > > |
數組< struct <字符串,b: struct < c: string > > > |
|
目標表模式更改為數組< struct <字符串,b: struct < c:字符串,d: string > > >。 |
處理NullType
列模式更新<一個class="headerlink" href="//www.eheci.com/docs/delta/#dealing-with-nulltype-columns-in-schema-updates" title="">
因為拚花不支持NullType
,NullType
列從DataFrame當編寫成三角洲表下降,但仍存儲在模式。當接收到一個不同的數據類型列,三角洲湖合並到新數據類型的模式。如果δ收到一個湖NullType
對於一個已有的列,保留舊模式和新列是在寫了。
NullType
在不支持流媒體。因為使用流媒體時必須設置模式這應該是非常罕見的。NullType
也不接受等複雜類型ArrayType
和MapType
。
替換表模式<一個class="headerlink" href="//www.eheci.com/docs/delta/#replace-table-schema" title="">
默認情況下,覆蓋一個表中的數據不會覆蓋模式。當覆蓋表使用模式(“覆蓋”)
沒有replaceWhere
,您可能還想覆蓋寫入數據的模式。你替換的模式和分區表通過設置overwriteSchema
選項真正的
:
df。寫。選項(“overwriteSchema”,“真正的”)