使用生成的列湖三角洲
預覽
這個特性是在公共預覽。
這個特性可以在磚運行時8.3及以上。
三角洲湖支持生成的列是一種特殊類型的列的值是自動生成基於用戶指定的函數在三角洲表中其他列。當你寫與生成的列一個表,你沒有明確為他們提供值,三角洲湖自動計算值。例如,您可以自動生成日期列(分區表的日期)從時間戳列;任何寫進表隻需要指定時間戳列的數據。然而,如果你明確地為他們提供值,必須滿足的值約束(<值>< = ><代表達式>)是真正的
或與一個錯誤寫會失敗。
重要的
表創建表生成的列有更高的作家比默認協議版本。看到磚三角洲湖管理功能的兼容性如何?理解表協議版本控製和意味著什麼有更高版本的表協議版本。
學習如何使用生成的列
下麵的例子顯示了如何創建一個表生成的列:
創建表默認的。people10m(idINT,firstName字符串,middleName字符串,姓字符串,性別字符串,生日時間戳,dateOfBirth日期生成的總是作為(投(生日作為日期)),ssn字符串,工資INT)
DeltaTable。創建(火花)\。的表(“default.people10m”)\。addColumn(“id”,“INT”)\。addColumn(“firstName”,“字符串”)\。addColumn(“middleName”,“字符串”)\。addColumn(“姓”,“字符串”,評論=“姓”)\。addColumn(“性別”,“字符串”)\。addColumn(“生日”,“時間戳”)\。addColumn(“dateOfBirth”,DateType(),generatedAlwaysAs=“鑄(生日日期)”)\。addColumn(“ssn”,“字符串”)\。addColumn(“工資”,“INT”)\。執行()
DeltaTable。創建(火花)。的表(“default.people10m”)。addColumn(“id”,“INT”)。addColumn(“firstName”,“字符串”)。addColumn(“middleName”,“字符串”)。addColumn(DeltaTable。columnBuilder(“姓”)。數據類型(“字符串”)。評論(“姓”)。構建())。addColumn(“姓”,“字符串”,評論=“姓”)。addColumn(“性別”,“字符串”)。addColumn(“生日”,“時間戳”)。addColumn(DeltaTable。columnBuilder(“dateOfBirth”)。數據類型(DateType)。generatedAlwaysAs(“鑄(dateOfBirth日期)”)。構建())。addColumn(“ssn”,“字符串”)。addColumn(“工資”,“INT”)。執行()
生成的列存儲當作正常的列。也就是說,他們占據存儲。
以下限製適用於生成的列:
一代表達式可以使用任何火花的SQL函數始終返回相同的結果給出相同的參數值時,除了以下類型的功能:
用戶自定義函數。
聚合函數。
窗口函數。
函數返回多個行。
磚運行時的9.1及以上,
合並
當你設定操作支持生成列spark.databricks.delta.schema.autoMerge.enabled
為true。
與光子磚運行時8.4及以上的支持,三角洲湖可以生成分區時過濾器為一個查詢分區列被定義為一個以下表達式:
鑄造(坳作為日期)
和類型的上校
是時間戳
。(col)
和類型的上校
是時間戳
。兩個分區列定義的
年(col),月(col)
和類型的上校
是時間戳
。三個分區列定義
年(col),月(col),天(col)
和類型的上校
是時間戳
。四個分區列定義的
年(col),月(col),天(col),小時(col)
和類型的上校
是時間戳
。SUBSTRING(坳,pos機,蘭)
和類型的上校
是字符串
DATE_FORMAT(坳,格式)
和類型的上校
是時間戳
。你隻能使用日期的格式使用以下模式:
yyyy-MM
和yyyy-MM-dd-HH
。在磚運行時10.4 LTS以上,您還可以使用以下模式:
yyyy-MM-dd
。
如果一個分區列被定義為一個前麵的表達式,使用底層的基礎和查詢過濾器數據列的表達式,一代三角洲湖看著基列之間的關係,生成的列,並填充分區過濾器生成基於分區列如果可能的話。例如,得到下表:
創建表事件(eventId長整型數字,數據字符串,eventType字符串,eventTime時間戳,eventDate日期生成的總是作為(投(eventTime作為日期)))分區通過(eventType,eventDate)
如果你然後運行下麵的查詢:
選擇*從事件在哪裏eventTime> =“2020-10-01”就是< =“2020-10-01 12:00:00”
三角洲湖自動生成一個分區過濾器,這樣前麵的查詢隻讀取的數據分區日期= 2020-10-01
即使沒有指定分區過濾器。
另外一個例子,得到下表:
創建表事件(eventId長整型數字,數據字符串,eventType字符串,eventTime時間戳,一年INT生成的總是作為(一年(eventTime)),月INT生成的總是作為(月(eventTime)),一天INT生成的總是作為(一天(eventTime)))分區通過(eventType,一年,月,一天)
如果你然後運行下麵的查詢:
選擇*從事件在哪裏eventTime> =“2020-10-01”就是< =“2020-10-01 12:00:00”
三角洲湖自動生成一個分區過濾器,這樣前麵的查詢隻讀取的數據分區年= 2020 /月= 10 /天= 1
即使沒有指定分區過濾器。
您可以使用一個解釋條款和檢查提供的計劃是否三角洲湖自動生成任何分區過濾器。
使用標識列在三角洲湖
重要的
聲明一個標識列在三角洲表禁用並發事務。隻使用標識列在用例並發寫入目標表不需要。
三角洲湖的身份列生成的列分配惟一的值的類型為每個記錄插入到表中。您可以指定一個初始值和步長,可以包括積極的和消極的價值觀。標識列隻支持長整型數字
如果指定值類型和操作失敗超過支持的範圍長整型數字
。
值指定的身份列是獨特和增量的方向指定的步驟,在指定的步驟大小的倍數,但不保證是連續的。
用戶可以選擇指定標識列的值在insert操作,但這可以通過使用禁用總是
在標識列關鍵字聲明。
表無法分區的一個標識列,你不能標識列上執行更新操作。
你不能將標識列添加到現有表。與標識列創建一個表,看看創建表(使用)。
學習與數據同步的身份列值,明白了ALTER TABLE。