表批讀和寫
三角洲湖支持大多數的選項提供的Apache火花DataFrame讀寫api來執行批處理讀和寫在桌子上。
三角洲湖上的SQL命令的更多信息,請參閱
磚運行時7。x,上圖:三角洲湖語句
請注意
下麵的代碼示例使用兩級的一些命名空間符號組成的一個模式(也稱為一個數據庫)和一個表或視圖(例如,default.people10m
)。使用這些示例統一目錄,更換二級與三級統一目錄名稱空間名稱空間符號組成的一個目錄,模式和表或視圖(例如,main.default.people10m
)。有關更多信息,請參見使用三級名稱空間符號統一目錄。
創建一個表
三角洲湖支持創建兩種類型的tables-tables metastore和表中定義所定義的路徑。
你可以通過以下方式創建表。
SQL DDL命令:您可以使用標準的SQL DDL命令支持Apache火花(例如,
創建表
和取代表
三角洲)來創建表。創建表如果不存在默認的。people10m(idINT,firstName字符串,middleName字符串,姓字符串,性別字符串,生日時間戳,ssn字符串,工資INT)使用δ創建或取代表默認的。people10m(idINT,firstName字符串,middleName字符串,姓字符串,性別字符串,生日時間戳,ssn字符串,工資INT)使用δ
請注意
在磚運行時8.0及以上,三角洲湖是默認的格式和你不需要
使用δ
。請注意
在磚運行時7.0及以上,以避免最終一致性問題AWS S3,磚推薦使用
創建或取代
語法,而不是下降表
緊隨其後的是一個創建表
。在磚運行時7.0及以上,SQL還支持創建表在一個蜂巢metastore路徑不創建一個條目。
——創建或替換表的路徑創建或取代表δ。' /tmp/δ/people10m”(idINT,firstName字符串,middleName字符串,姓字符串,性別字符串,生日時間戳,ssn字符串,工資INT)使用δ
DataFrameWriter
API:如果你想同時創建一個表,將數據插入火花DataFrames或數據集,您可以使用火花DataFrameWriter
(Scala或Java和Python)。#在使用DataFrame metastore的模式中創建表並寫入數據df。寫。格式(“δ”)。saveAsTable(“default.people10m”)#使用DataFrame創建或替換分區表路徑模式和寫/覆蓋數據df。寫。格式(“δ”)。模式(“覆蓋”)。保存(“/ tmp /δ/ people10m”)
/ /創建表使用DataFrame metastore的模式和寫入數據df。寫。格式(“δ”)。saveAsTable(“default.people10m”)/ /創建表路徑使用DataFrame的模式和寫入數據df。寫。格式(“δ”)。模式(“覆蓋”)。保存(“/ tmp /δ/ people10m”)
在磚運行時8.0及以上,三角洲湖是默認格式,您不需要指定
使用δ
,格式(“δ”)
,或使用(“δ”)
。在磚運行時的7.0及以上,您還可以創建使用火花三角洲表
DataFrameWriterV2
API。
DeltaTableBuilder
API:您還可以使用DeltaTableBuilder
API在三角洲湖創建表。相比DataFrameWriter API,該API可以更容易地指定附加信息,如專欄評論,表屬性,和生成的列。預覽
這個特性是在公共預覽。
請注意
這個特性可以在磚運行時8.3及以上。
#在metastore創建表DeltaTable。createIfNotExists(火花)\。的表(“default.people10m”)\。addColumn(“id”,“INT”)\。addColumn(“firstName”,“字符串”)\。addColumn(“middleName”,“字符串”)\。addColumn(“姓”,“字符串”,評論=“姓”)\。addColumn(“性別”,“字符串”)\。addColumn(“生日”,“時間戳”)\。addColumn(“ssn”,“字符串”)\。addColumn(“工資”,“INT”)\。執行()#創建或替換表與路徑,並添加屬性DeltaTable。createOrReplace(火花)\。addColumn(“id”,“INT”)\。addColumn(“firstName”,“字符串”)\。addColumn(“middleName”,“字符串”)\。addColumn(“姓”,“字符串”,評論=“姓”)\。addColumn(“性別”,“字符串”)\。addColumn(“生日”,“時間戳”)\。addColumn(“ssn”,“字符串”)\。addColumn(“工資”,“INT”)\。財產(“描述”,“與人數據表”)\。位置(“/ tmp /δ/ people10m”)\。執行()
/ /創建metastore表DeltaTable。createOrReplace(火花)。的表(“default.people10m”)。addColumn(“id”,“INT”)。addColumn(“firstName”,“字符串”)。addColumn(“middleName”,“字符串”)。addColumn(DeltaTable。columnBuilder(“姓”)。數據類型(“字符串”)。評論(“姓”)。構建())。addColumn(“姓”,“字符串”,評論=“姓”)。addColumn(“性別”,“字符串”)。addColumn(“生日”,“時間戳”)。addColumn(“ssn”,“字符串”)。addColumn(“工資”,“INT”)。執行()/ /創建或替換表與路徑,並添加屬性DeltaTable。createOrReplace(火花)。addColumn(“id”,“INT”)。addColumn(“firstName”,“字符串”)。addColumn(“middleName”,“字符串”)。addColumn(DeltaTable。columnBuilder(“姓”)。數據類型(“字符串”)。評論(“姓”)。構建())。addColumn(“姓”,“字符串”,評論=“姓”)。addColumn(“性別”,“字符串”)。addColumn(“生日”,“時間戳”)。addColumn(“ssn”,“字符串”)。addColumn(“工資”,“INT”)。財產(“描述”,“與人數據表”)。位置(“/ tmp /δ/ people10m”)。執行()
看到API文檔獲取詳細信息。
另請參閱創建一個表。
對數據進行分區
您可以加快查詢或對數據進行分區DML謂詞包括分區的列。當你創建一個增量表分區數據,指定一個分區的列。下麵的例子分區的性別。
——在metastore創建表創建表默認的。people10m(idINT,firstName字符串,middleName字符串,姓字符串,性別字符串,生日時間戳,ssn字符串,工資INT)使用δ分區通過(性別)
df。寫。格式(“δ”)。partitionBy(“性別”)。saveAsTable(“default.people10m”)DeltaTable。創建(火花)\。的表(“default.people10m”)\。addColumn(“id”,“INT”)\。addColumn(“firstName”,“字符串”)\。addColumn(“middleName”,“字符串”)\。addColumn(“姓”,“字符串”,評論=“姓”)\。addColumn(“性別”,“字符串”)\。addColumn(“生日”,“時間戳”)\。addColumn(“ssn”,“字符串”)\。addColumn(“工資”,“INT”)\。partitionedBy(“性別”)\。執行()
df。寫。格式(“δ”)。partitionBy(“性別”)。saveAsTable(“default.people10m”)DeltaTable。createOrReplace(火花)。的表(“default.people10m”)。addColumn(“id”,“INT”)。addColumn(“firstName”,“字符串”)。addColumn(“middleName”,“字符串”)。addColumn(DeltaTable。columnBuilder(“姓”)。數據類型(“字符串”)。評論(“姓”)。構建())。addColumn(“姓”,“字符串”,評論=“姓”)。addColumn(“性別”,“字符串”)。addColumn(“生日”,“時間戳”)。addColumn(“ssn”,“字符串”)。addColumn(“工資”,“INT”)。partitionedBy(“性別”)。執行()
確定一個表包含一個特定的分區,使用聲明選擇COUNT (*)>0從<表名稱>在哪裏<劃分字段>=<值>
。如果分區存在,真正的
返回。例如:
選擇數(*)>0作為”分區存在”從默認的。people10m在哪裏性別=“M”
顯示(火花。sql(“SELECT COUNT(*) > 0的分區存在違約。people10m性別= M”))
顯示(火花。sql(“SELECT COUNT(*) > 0的分區存在違約。people10m性別= M”))
控製數據的位置
metastore中定義的表,您可以選擇指定位置
作為一個路徑。創建一個指定的表位置
被認為是由metastore非托管。與管理表,沒有指定路徑,非托管表的文件不刪除當你下降
桌子上。
當您運行創建表
與一個位置
那已經包含數據存儲使用三角洲湖,湖三角洲以下:
如果您指定隻有表名稱和位置,例如:
創建表默認的。people10m使用δ位置“/ tmp /δ/ people10m”
桌子放在metastore自動繼承模式,現有的分區和表屬性數據。此功能可用於metastore“進口的”數據。
如果您指定任何配置(模式、分區或表屬性),三角洲湖驗證規範完全匹配的配置現有數據。
重要的
如果不指定的配置完全匹配的配置數據,三角洲湖拋出一個異常描述差異。
請注意
metastore不是真相之源三角洲表的最新信息。事實上,metastore可能不包含所有的表定義元數據模式和屬性。它包含的位置表,表的事務日誌的位置是真理的源泉。如果你查詢metastore從係統,不知道這Delta-specific定製,您可能會看到表信息不完整或不新鮮的。
使用生成的列
預覽
這個特性是在公共預覽。
請注意
這個特性可以在磚運行時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”)\。partitionedBy(“性別”)\。執行()
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”)。partitionedBy(“性別”)。執行()
生成的列存儲當作正常的列。也就是說,他們占據存儲。
以下限製適用於生成的列:
一代表達式可以使用任何火花的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(坳,格式)
和類型的上校
是時間戳
。
如果一個分區列被定義為一個前麵的表達式,使用底層的基礎和查詢過濾器數據列的表達式,一代三角洲湖看著基列之間的關係,生成的列,並填充分區過濾器生成基於分區列如果可能的話。例如,得到下表:
創建表事件(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
即使沒有指定分區過濾器。
您可以使用一個解釋條款和檢查提供的計劃是否三角洲湖自動生成任何分區過濾器。
在列名使用特殊字符
默認情況下,特殊字符,如空間和任何字符,{}()\ n \ t =
不支持表列名。包括這些特殊字符表的列名,啟用列映射。
默認表屬性
三角洲湖SparkSession覆蓋默認配置設置表屬性創建新三角洲湖表在會話中。中使用的前綴SparkSession不同於表中使用的配置屬性。
三角洲湖相依 |
SparkSession相依 |
---|---|
|
|
例如,設置delta.appendOnly=真正的
財產所有新三角洲湖表中創建一個會話,設置如下:
集火花。磚。δ。屬性。違約。appendOnly=真正的
修改現有表的表屬性,使用設置TBLPROPERTIES。
讀一個表
你可以加載一個三角洲表DataFrame通過指定表名或路徑:
選擇*從默認的。people10m——metastore查詢表選擇*從δ。' /tmp/δ/people10m”——查詢表的道路
火花。表(“default.people10m”)# metastore查詢表火花。讀。格式(“δ”)。負載(“/ tmp /δ/ people10m”)#查詢表的路徑
火花。表(“default.people10m”)/ / metastore查詢表火花。讀。格式(“δ”)。負載(“/ tmp /δ/ people10m”)/ /創建表的路徑進口io。δ。值得一提的。_火花。讀。δ(“/ tmp /δ/ people10m”)
返回的DataFrame自動讀表的最新快照查詢;你永遠不需要運行刷新表
。三角洲湖自動使用分區和數據讀取的最小數量數據時適用的謂詞的查詢。
查詢一個表(舊的快照時間旅行)
三角洲湖時間旅行允許您查詢一個年長的三角洲表的快照。時間旅行有許多用例,包括:
重新創建分析、報告、或輸出(例如,機器學習模型)的輸出。這對調試或審計可能是有用的,尤其是在監管的行業。
編寫複雜的時態查詢。
在您的數據修複錯誤。
為一組提供快照隔離快速變化的表的查詢。
本節描述表的查詢舊版本的支持方法,數據存儲問題,並提供了示例。
語法
本節展示如何查詢一個舊版本的一個增量表。
在本節中:
SQL作為的
語法
選擇*從table_name時間戳作為的timestamp_expression選擇*從table_name版本作為的版本
在哪裏
timestamp_expression
可以是任何一個:2018 - 10 - 18 t22:15:12.013z
,也就是說,可以把一個字符串,該字符串轉換為一個時間戳鑄造(' 2018-10-1813:36:32c '作為時間戳)
“2018-10-18”
,也就是說,一個日期字符串current_timestamp ()- - - - - -時間間隔12小時
date_sub(當前日期(),1)
其他表達式,也可以把一個時間戳
版本
是一個長期的價值,可以獲得輸出的嗎描述曆史table_spec
。
既不timestamp_expression
也不版本
子查詢。
例子
選擇*從默認的。people10m時間戳作為的2018 - 10 - 18 t22:15:12.013z選擇*從δ。' /tmp/δ/people10m”版本作為的123年
DataFrameReader選項
DataFrameReader選項允許你創建一個從三角洲DataFrame表是固定到一個特定版本的表。
df1=火花。讀。格式(“δ”)。選項(“timestampAsOf”,timestamp_string)。負載(“/ tmp /δ/ people10m”)df2=火花。讀。格式(“δ”)。選項(“versionAsOf”,版本)。負載(“/ tmp /δ/ people10m”)
為timestamp_string
,隻有日期或時間戳字符串是接受。例如,“2019-01-01”
和“2019 - 01 - 01 t00:00:00.000z”
。
常見的模式是使用最新的三角洲表的狀態在下遊磚工作更新應用程序的執行。
因為δ表自動更新,從三角洲DataFrame加載表可能返回不同的結果在調用底層數據是否更新。通過時間旅行,你可以修複DataFrame在調用返回的數據:
latest_version=火花。sql(“選擇馬克斯(版本)(描述曆史delta. / tmp /δ/ people10m)”)。收集()df=火花。讀。格式(“δ”)。選項(“versionAsOf”,latest_version(0][0])。負載(“/ tmp /δ/ people10m”)
@
語法
你可能有一個參數化的管道,管道是一個參數的輸入路徑的你的工作。後的執行你的工作,你可能想要繁殖輸出在未來一段時間。在這種情況下,您可以使用@
語法來指定時間戳或版本。必須在時間戳yyyyMMddHHmmssSSS
格式。您可以指定一個版本@
通過將一個v
的版本。例如,要查詢版本123年
為表people10m
,指定people10m@v123
。
選擇*從默認的。people10m@20190101000000000選擇*從默認的。people10m@v123
火花。讀。格式(“δ”)。負載(“/ tmp /δ/ people10m@20190101000000000”)# 2019-01-01 00:00:00.000表火花。讀。格式(“δ”)。負載(“/ tmp /δ/ people10m@v123”)123 #表版本
例子
為用戶解決意外刪除一個表
111年
:
插入成my_table選擇*從my_table時間戳作為的date_sub(當前日期(),1)在哪裏用戶標識=111年
解決意外錯誤更新一個表:
合並成my_table目標使用my_table時間戳作為的date_sub(當前日期(),1)源在源。用戶標識=目標。用戶標識當匹配然後更新集*
查詢添加新客戶的數量在過去的一周。beplay体育app下载地址
選擇數(截然不同的用戶標識)- - - - - -(選擇數(截然不同的用戶標識)從my_table時間戳作為的date_sub(當前日期(),7))
數據保留
時間旅行前一版本,你必須保留這兩個的日誌和數據文件的版本。
δ表數據文件支持從來沒有自動刪除;隻有當你刪除數據文件運行真空。真空
不刪除三角洲日誌文件;日誌文件自動清理後檢查點都寫。
在默認情況下可以時間旅行到三角洲表30天,除非你有:
運行
真空
你的差值表。改變了數據或日誌文件中使用以下保留時間段表屬性:
delta.logRetentionDuration=“間隔<時間>”
:控製表的曆史保存多久。默認值是時間間隔30.天
。每次寫的一個檢查站,磚自動清理日誌條目超過保留時間間隔。如果你將這個配置設置為一個足夠大的價值,許多日誌條目被保留。這應該不會影響性能,操作日誌是常數時間。曆史上的操作是平行但日誌大小增加將變得更加昂貴。
delta.deletedFileRetentionDuration=“間隔<時間>”
:控製多久以前文件必須被刪除之前的候選人真空
。默認值是時間間隔7天
。訪問曆史數據即使你運行的30天
真空
差值表,集delta.deletedFileRetentionDuration=“間隔30.天”
。此設置可能會導致您的存儲成本上升。
寫一個表
附加
自動將新數據添加到現有的差值表,使用附加
模式:
插入成默認的。people10m選擇*從更多人
df。寫。格式(“δ”)。模式(“添加”)。保存(“/ tmp /δ/ people10m”)df。寫。格式(“δ”)。模式(“添加”)。saveAsTable(“default.people10m”)
df。寫。格式(“δ”)。模式(“添加”)。保存(“/ tmp /δ/ people10m”)df。寫。格式(“δ”)。模式(“添加”)。saveAsTable(“default.people10m”)進口io。δ。值得一提的。_df。寫。模式(“添加”)。δ(“/ tmp /δ/ people10m”)
覆蓋
自動替換表中的所有數據,使用覆蓋
模式:
插入覆蓋表默認的。people10m選擇*從更多人
df。寫。格式(“δ”)。模式(“覆蓋”)。保存(“/ tmp /δ/ people10m”)df。寫。格式(“δ”)。模式(“覆蓋”)。saveAsTable(“default.people10m”)
df。寫。格式(“δ”)。模式(“覆蓋”)。保存(“/ tmp /δ/ people10m”)df。寫。格式(“δ”)。模式(“覆蓋”)。saveAsTable(“default.people10m”)進口io。δ。值得一提的。_df。寫。模式(“覆蓋”)。δ(“/ tmp /δ/ people10m”)
使用DataFrames之外,您還可以有選擇地覆蓋隻匹配一個任意的數據表達。這個功能是可用的磚運行時9.1 LTS及以上。下麵的命令自動替換事件1月目標表,分區的start_date
中的數據df
:
df。寫\。格式(“δ”)\。模式(“覆蓋”)\。選項(“replaceWhere”,“start_date > = ' 2017-01-01 '和end_date < = 2017-01-31”)\。保存(“/ tmp /δ/事件”)
df。寫。格式(“δ”)。模式(“覆蓋”)。選項(“replaceWhere”,“start_date > = ' 2017-01-01 '和end_date < = 2017-01-31”)。保存(“/ tmp /δ/事件”)
這個示例代碼寫出數據df
,驗證與謂詞匹配,並執行一個原子替換。如果你想寫出數據不匹配謂詞,來取代匹配目標表中的行,您可以禁用約束檢查通過設置spark.databricks.delta.replaceWhere.constraintCheck.enabled
假:
火花。相依。集(“spark.databricks.delta.replaceWhere.constraintCheck.enabled”,假)
火花。相依。集(“spark.databricks.delta.replaceWhere.constraintCheck.enabled”,假)
在磚運行時9.0及以下,replaceWhere
覆蓋數據匹配謂詞在分區列。下麵的命令自動取代了月1月目標表,分區的日期
中的數據df
:
df。寫\。格式(“δ”)\。模式(“覆蓋”)\。選項(“replaceWhere”,“生日> = ' 2017-01-01 '和生日< = 2017-01-31”)\。保存(“/ tmp /δ/ people10m”)
df。寫。格式(“δ”)。模式(“覆蓋”)。選項(“replaceWhere”,“生日> = ' 2017-01-01 '和生日< = 2017-01-31”)。保存(“/ tmp /δ/ people10m”)
在磚運行時9.1及以上的,如果你想回到舊的行為,您可以禁用spark.databricks.delta.replaceWhere.dataColumns.enabled
國旗:
火花。相依。集(“spark.databricks.delta.replaceWhere.dataColumns.enabled”,假)
火花。相依。集(“spark.databricks.delta.replaceWhere.dataColumns.enabled”,假)
動態分區覆蓋
預覽
這個特性是在公共預覽。
磚運行時11.1及以上支持動態為分區表分區覆蓋模式。
在動態分區覆蓋模式下,我們在每個邏輯分區覆蓋所有現有數據的編寫將提交新的數據。任何現有的邏輯分區的寫不包含數據將保持不變。這種模式隻適用於當數據被寫在覆蓋模式:插入覆蓋
在SQL或DataFrame寫字df.write.mode(“覆蓋”)
。
配置動態分區覆蓋模式通過設置引發會話配置spark.sql.sources.partitionOverwriteMode
來動態
。你也可以啟用這個通過設置DataFrameWriter
選項partitionOverwriteMode
來動態
。如果存在,query-specific選項覆蓋會話配置中定義的模式。的默認值partitionOverwriteMode
是靜態
。
集火花。sql。來源。partitionOverwriteMode=動態;插入覆蓋表默認的。people10m選擇*從更多人;
df。寫\。格式(“δ”)\。模式(“覆蓋”)\。選項(“partitionOverwriteMode”,“動態”)\。saveAsTable(“default.people10m”)
df。寫。格式(“δ”)。模式(“覆蓋”)。選項(“partitionOverwriteMode”,“動態”)。saveAsTable(“default.people10m”)
請注意
動態分區覆蓋衝突與選擇replaceWhere
分區表。
如果啟用了動態分區覆蓋在火花會話配置中,和
replaceWhere
作為一個提供DataFrameWriter
選項,然後根據三角洲湖覆蓋數據replaceWhere
表達式(query-specific選項覆蓋會話配置)。如果你會收到一個錯誤
DataFrameWriter
動態分區覆蓋和選項replaceWhere
啟用。
重要的
驗證數據與動態分區覆蓋觸動隻有預期的分區。一行在錯誤的分區可以導致無意中覆蓋整個分區。我們建議使用replaceWhere
指定的數據覆蓋。
如果意外地覆蓋一個分區,你可以使用找到最後一個提交的版本引發會話撤消更改。
三角洲湖支持更新表,請參閱表刪除、更新和合並。
限行寫在一個文件中
您可以使用SQL會話配置spark.sql.files.maxRecordsPerFile
指定的最大記錄數為三角洲湖表寫入一個文件。指定一個值為零或負值代表沒有限製。
在磚運行時的10.5及以上,您還可以使用DataFrameWriter選項maxRecordsPerFile
當使用DataFrame api編寫到三角洲湖表。當maxRecordsPerFile
指定的值SQL會話配置spark.sql.files.maxRecordsPerFile
將被忽略。
df。寫。格式(“δ”)\。模式(“添加”)\。選項(“maxRecordsPerFile”,“10000”)\。保存(“/ tmp /δ/ people10m”)
df。寫。格式(“δ”)。模式(“添加”)。選項(“maxRecordsPerFile”,“10000”)。保存(“/ tmp /δ/ people10m”)
冪等寫道
有時寫數據到三角洲的工作表重新啟動由於各種原因(例如,工作遇到失敗)。失敗的工作可能有也可能沒有書麵終止前三角洲表的數據。的情況下的數據寫入三角洲表,重新啟動工作將相同的數據寫入三角洲表導致重複數據。
為了解決這個問題,δ表支持以下DataFrameWriter
的選項,使得冪等寫道:
txnAppId
:一個獨一無二的字符串,您可以通過在每個DataFrame
寫。例如,這可以工作的名稱。txnVersion
:一個單調遞增數字作為事務的版本。這個數字需要獨特的數據寫入到三角洲表(s)。例如,這可以即時查詢時的時代秒第一次未遂。任何後續重新啟動相同的工作需要有相同的值txnVersion
。
上麵的選項需要獨特的組合為每個新數據被吸收到表和三角洲txnVersion
需要攝取高於去年數據到三角洲表中。例如:
最後成功地寫數據包含選項值
dailyETL: 23423
(txnAppId: txnVersion
)。接下來應該寫數據
txnAppId=dailyETL
和txnVersion
至少23424年
(一個超過最後寫數據txnVersion
)。任何試圖寫入數據
txnAppId=dailyETL
和txnVersion
作為23422年
將被忽略,因為txnVersion
不到最後一個記錄嗎txnVersion
在表中。試圖寫入數據
txnAppId: txnVersion
作為anotherETL: 23424
成功寫入數據表,因為它包含一個不同的嗎txnAppId
相比去年攝入數據相同的選項值。
警告
這個解決方案假設數據寫入三角洲表(s)在多個重試的工作是一樣的。如果δ表中寫入嚐試成功但由於一些下遊失敗還有第二個嚐試時候選項相同,但是不同的數據寫上去的,那麼第二次寫嚐試將被忽略。這可能會導致意想不到的結果。
設置用戶定義元數據提交
您可以指定用戶定義的字符串作為元數據提交由這些操作,或者使用DataFrameWriter選項userMetadata
或SparkSession配置spark.databricks.delta.commitInfo.userMetadata
。如果他們被指定,那麼選擇偏好。這個定義的元數據是可讀的曆史操作。
集火花。磚。δ。commitInfo。userMetadata=覆蓋- - - - - -為- - - - - -修複- - - - - -不正確的- - - - - -數據插入覆蓋默認的。people10m選擇*從更多人
df。寫。格式(“δ”)\。模式(“覆蓋”)\。選項(“userMetadata”,“overwritten-for-fixing-incorrect-data”)\。保存(“/ tmp /δ/ people10m”)
df。寫。格式(“δ”)。模式(“覆蓋”)。選項(“userMetadata”,“overwritten-for-fixing-incorrect-data”)。保存(“/ tmp /δ/ people10m”)
模式驗證
三角洲湖自動驗證的模式DataFrame寫入表的兼容模式。三角洲湖使用以下規則來確定是否寫從DataFrame表兼容:
所有DataFrame列必須存在於目標表。如果有列DataFrame表中不存在,會拋出一個異常。列在表而不是DataFrame設置為null。
DataFrame列的數據類型必須匹配目標表的列數據類型。如果它們不匹配,會拋出一個異常。
DataFrame列名不能隻有情況不同。這意味著您不能列如“Foo”和“Foo”定義在相同的表。雖然您可以使用火花,以防敏感或不敏感(默認)模式,拚花是大小寫敏感的,當存儲和返回列信息。三角洲湖case-preserving但不敏感當存儲模式,這一限製,以避免潛在的錯誤,數據損壞或損失的問題。
三角洲湖支持DDL顯式地添加新列和自動更新模式的能力。
如果您指定其他選項,例如partitionBy
,結合附加模式,三角洲湖驗證他們為任何不匹配匹配和拋出一個錯誤。當partitionBy
不存在,添加自動跟隨現有數據的分區。
請注意
在磚運行時的7.0及以上,插入
語法提供了模式的實施和支持模式演化。如果一個列的數據類型不能安全地把你三角洲湖表的數據類型,則會拋出運行時異常。如果模式演化啟用新列可以作為最後一列你的存在模式(或嵌套列)模式演變。
關於執行和發展模式的更多信息在三角洲湖,看這個YouTube視頻(55分鍾)。
更新表模式
三角洲湖允許您更新一個表的模式。支持以下類型的變化:
添加新列(在任意位置)
重新安排現有的列
重命名現有列
你可以讓這些變化顯式或隱式地使用DML使用DDL。
重要的
當你更新一個δ表模式,流讀取該表的終止。如果你想繼續流必須重新啟動它。
推薦的方法,請參閱生產磚上考慮結構的流媒體應用程序。
明確更新模式
您可以使用以下DDL來顯式地改變一個表的模式。
添加列
改變表table_name添加列(col_namedata_type(評論col_comment](第一個|後colA_name),…)
默認情況下,nullability真正的
。
添加一個列到嵌套,使用:
改變表table_name添加列(col_name。nested_col_namedata_type(評論col_comment](第一個|後colA_name),…)
改變列的評論或排序
改變表table_name改變(列]col_namecol_namedata_type(評論col_comment](第一個|後colA_name]
改變一個列在一個嵌套的領域,使用:
改變表table_name改變(列]col_name。nested_col_namenested_col_namedata_type(評論col_comment](第一個|後colA_name]
重命名列
預覽
這個特性是在公共預覽。
請注意
這個特性可以在磚運行時10.2及以上。
重命名列不重寫任何列的現有數據,您必須啟用列映射表。看到三角洲列映射。
重命名一個列:
改變表table_name重命名列old_col_name來new_col_name
重命名一個嵌套的字段:
改變表table_name重命名列col_name。old_nested_field來new_nested_field
看到三角洲列映射。
刪除列
預覽
這個特性是在公共預覽。
請注意
這個特性可以在磚運行時11.0及以上。
刪除列僅元數據操作,而無需重新編寫任何數據文件,您必須啟用列映射表。看到三角洲列映射。
放棄一個列:
改變表table_name下降列col_name
將多個列:
改變表table_name下降列(col_name_1,col_name_2)
替換表模式
默認情況下,覆蓋一個表中的數據不會覆蓋模式。當覆蓋表使用模式(“覆蓋”)
沒有replaceWhere
,您可能還想覆蓋寫入數據的模式。你替換的模式和分區表通過設置overwriteSchema
選項真正的
:
df。寫。選項(“overwriteSchema”,“真正的”)
表意見
三角洲湖支持創建視圖的三角洲表就像你可能會與一個數據源表。
這些視圖集成訪問控製表允許列和行級安全。
當你和視圖操作的核心挑戰是解決模式。如果你改變一個增量表模式,你必須重新創建導數觀點占任何添加模式。例如,如果你添加一個新的列到三角洲表,您必須確保這個專欄有適當的基表的視圖之上。
表屬性
你可以存儲自己的元數據表屬性使用TBLPROPERTIES
在創建
和改變
。然後,您可以顯示
元數據。例如:
改變表默認的。people10m集TBLPROPERTIES(“部門”=“會計”,“delta.appendOnly”=“真正的”);——顯示表的屬性。顯示TBLPROPERTIES默認的。people10m;——顯示“部門”表屬性。顯示TBLPROPERTIES默認的。people10m(“部門”);
TBLPROPERTIES
被存儲為δ表元數據的一部分。你不能定義新的TBLPROPERTIES
在一個創建
聲明如果δ表已經存在於一個給定的位置。
此外,定製的行為和性能,支持某些湖δ表屬性:
在三角洲表塊刪除和更新:
delta.appendOnly = true
。配置時間旅行保留屬性:
delta.logRetentionDuration = < interval-string >
和delta.deletedFileRetentionDuration = < interval-string >
。有關詳細信息,請參見數據保留。配置收集統計數據的列數:
delta.dataSkippingNumIndexedCols = n
。這個屬性表示統計數據收集的作家隻有第一n
表中的列。也跳過代碼忽略了統計數據以外的任何列這一列索引。這個屬性將隻影響新寫入的數據。
隨機文件的前綴,以避免熱點在S3中元數據:
delta.randomizeFilePrefixes = true
。需要大量的表(成千上萬的每秒請求)的快速讀/寫操作,我們強烈建議奉獻一個S3 bucket表(定位表的根源桶),並使隨機文件前綴來得到最好的體驗。
請注意
修改一個增量表屬性是一個寫操作,將與其他衝突並發寫操作,導致他們失敗。我們建議您修改表屬性隻有當沒有並發寫操作放在桌子上。
你也可以設置三角洲。
前綴的屬性在第一次提交到三角洲表使用火花配置。例如,初始化一個增量表的屬性delta.appendOnly = true
,設置火花配置spark.databricks.delta.properties.defaults.appendOnly
來真正的
。例如:
火花。sql(“設置spark.databricks.delta.properties.defaults.appendOnly = true”)
火花。相依。集(“spark.databricks.delta.properties.defaults.appendOnly”,“真正的”)
火花。相依。集(“spark.databricks.delta.properties.defaults.appendOnly”,“真正的”)
看到也三角洲表屬性引用。
表元數據
三角洲湖有豐富的功能為探索表元數據。
它支持顯示(分區|列)
和描述表
。看到
它還提供了獨特的命令如下:
描述細節
提供的信息模式、分區表的大小,等等。有關詳細信息,請參見檢索三角洲表詳細信息。
描述曆史
提供了來源的信息,包括操作、用戶等等,每寫一個表和操作指標。表曆史保留30天。有關詳細信息,請參見檢索三角洲曆史表。
的探索和創建表與數據選項卡提供了一個可視化視圖的三角洲的詳細表信息和曆史表。除了表模式和樣本數據,你可以點擊曆史選項卡,查看曆史顯示的表描述曆史
。
配置存儲憑證
三角洲湖使用Hadoop文件係統api來訪問存儲係統。存儲係統的credentails通常可以通過Hadoop設置配置。三角洲湖Hadoop提供了多種方式來組配置類似於Apache火花。
火花配置
當你開始一個火花應用程序集群上,你可以設置引發的形式配置spark.hadoop。*
通過定製Hadoop配置。例如,設置一個值spark.hadoop.a.b.c
將值作為一個Hadoop配置a.b.c
,三角洲湖將會使用它來訪問Hadoop文件係統api。
看到__為更多的細節。
SQL會話配置
火花SQL會通過所有的電流SQL會話配置三角洲湖,湖三角洲將使用它們來訪問Hadoop文件係統api。例如,集a.b.c = x.y.z
會告訴三角洲湖通過價值x.y.z
作為一個Hadoop配置a.b.c
,三角洲湖將會使用它來訪問Hadoop文件係統api。
DataFrame選項
除了Hadoop文件係統配置設置通過火花(集群)配置或SQL會話配置,三角洲支持閱讀Hadoop文件係統配置DataFrameReader
和DataFrameWriter
選項(即選擇鍵開始fs。
前綴)表被讀取或寫入時,通過使用DataFrameReader.load(路徑)
或DataFrameWriter.save(路徑)
。
請注意
這個特性可以在磚運行時10.1及以上。
例如,您可以存儲credentails穿過DataFrame選項:
df1=火花。讀。格式(“δ”)\。選項(“fs.s3a.access.key”,“< access-key-1 >”)\。選項(“fs.s3a.secret.key”,“< secret-key-1 >”)\。讀(“…”)df2=火花。讀。格式(“δ”)\。選項(“fs.s3a.access.key”,“< access-key-1 >”)\。選項(“fs.s3a.secret.key”,“< secret-key-2 >”)\。讀(“…”)df1。聯盟(df2)。寫。格式(“δ”)\。模式(“覆蓋”)\。選項(“fs.s3a.access.key”,“< access-key-3 >”)\。選項(“fs.s3a.secret.key”,“< secret-key-3 >”)\。保存(“…”)
瓦爾df1=火花。讀。格式(“δ”)。選項(“fs.s3a.access.key”,“< access-key-1 >”)。選項(“fs.s3a.secret.key”,“< secret-key-1 >”)。讀(“…”)瓦爾df2=火花。讀。格式(“δ”)。選項(“fs.s3a.access.key”,“< access-key-2 >”)。選項(“fs.s3a.secret.key”,“< secret-key-2 >”)。讀(“…”)df1。聯盟(df2)。寫。格式(“δ”)。模式(“覆蓋”)。選項(“fs.s3a.access.key”,“< access-key-3 >”)。選項(“fs.s3a.secret.key”,“< secret-key-3 >”)。保存(“…”)
你可以找到的細節Hadoop文件係統配置為您的存儲數據源。