表批讀和寫

三角洲湖支持大多數的選項提供的Apache火花DataFrame讀寫api來執行批處理讀和寫在桌子上。

三角洲湖上的SQL命令的更多信息,請參閱

請注意

下麵的代碼示例使用兩級的一些命名空間符號組成的一個模式(也稱為一個數據庫)和一個表或視圖(例如,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)使用δ
  • DataFrameWriterAPI:如果你想同時創建一個表,將數據插入火花DataFrames或數據集,您可以使用火花DataFrameWriter(Scala或JavaPython)。

    #在使用DataFrame metastore的模式中創建表並寫入數據df格式(“δ”)saveAsTable(“default.people10m”)#使用DataFrame創建或替換分區表路徑模式和寫/覆蓋數據df格式(“δ”)模式(“覆蓋”)保存(“/ tmp /δ/ people10m”)
    / /創建表使用DataFrame metastore的模式和寫入數據df格式(“δ”)。saveAsTable(“default.people10m”)/ /創建表路徑使用DataFrame的模式和寫入數據df格式(“δ”)。模式(“覆蓋”)。保存(“/ tmp /δ/ people10m”)
    • 在磚運行時8.0及以上,三角洲湖是默認格式,您不需要指定使用δ,格式(“δ”),或使用(“δ”)

    • 在磚運行時的7.0及以上,您還可以創建使用火花三角洲表DataFrameWriterV2API。

  • DeltaTableBuilderAPI:您還可以使用DeltaTableBuilderAPI在三角洲湖創建表。相比DataFrameWriter API,該API可以更容易地指定附加信息,如專欄評論,表屬性,和生成的列

    預覽

    這個特性是在公共預覽

    請注意

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

    #在metastore創建表DeltaTablecreateIfNotExists(火花)\的表(“default.people10m”)\addColumn(“id”,“INT”)\addColumn(“firstName”,“字符串”)\addColumn(“middleName”,“字符串”)\addColumn(“姓”,“字符串”,評論=“姓”)\addColumn(“性別”,“字符串”)\addColumn(“生日”,“時間戳”)\addColumn(“ssn”,“字符串”)\addColumn(“工資”,“INT”)\執行()#創建或替換表與路徑,並添加屬性DeltaTablecreateOrReplace(火花)\addColumn(“id”,“INT”)\addColumn(“firstName”,“字符串”)\addColumn(“middleName”,“字符串”)\addColumn(“姓”,“字符串”,評論=“姓”)\addColumn(“性別”,“字符串”)\addColumn(“生日”,“時間戳”)\addColumn(“ssn”,“字符串”)\addColumn(“工資”,“INT”)\財產(“描述”,“與人數據表”)\位置(“/ tmp /δ/ people10m”)\執行()
    / /創建metastore表DeltaTablecreateOrReplace(火花)的表(“default.people10m”)addColumn(“id”,“INT”)addColumn(“firstName”,“字符串”)addColumn(“middleName”,“字符串”)addColumn(DeltaTablecolumnBuilder(“姓”)數據類型(“字符串”)評論(“姓”)構建())addColumn(“姓”,“字符串”,評論=“姓”)addColumn(“性別”,“字符串”)addColumn(“生日”,“時間戳”)addColumn(“ssn”,“字符串”)addColumn(“工資”,“INT”)執行()/ /創建或替換表與路徑,並添加屬性DeltaTablecreateOrReplace(火花)addColumn(“id”,“INT”)addColumn(“firstName”,“字符串”)addColumn(“middleName”,“字符串”)addColumn(DeltaTablecolumnBuilder(“姓”)數據類型(“字符串”)評論(“姓”)構建())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”)DeltaTablecreateOrReplace(火花)的表(“default.people10m”)addColumn(“id”,“INT”)addColumn(“firstName”,“字符串”)addColumn(“middleName”,“字符串”)addColumn(DeltaTablecolumnBuilder(“姓”)數據類型(“字符串”)評論(“姓”)構建())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(DeltaTablecolumnBuilder(“姓”)數據類型(“字符串”)評論(“姓”)構建())addColumn(“姓”,“字符串”,評論=“姓”)addColumn(“性別”,“字符串”)addColumn(“生日”,“時間戳”)addColumn(DeltaTablecolumnBuilder(“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相依

三角洲。<設計>

spark.databricks.delta.properties.defaults。<設計>

例如,設置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=dailyETLtxnVersion至少23424年(一個超過最後寫數據txnVersion)。

  • 任何試圖寫入數據txnAppId=dailyETLtxnVersion作為23422年將被忽略,因為txnVersion不到最後一個記錄嗎txnVersion在表中。

  • 試圖寫入數據txnAppId: txnVersion作為anotherETL: 23424成功寫入數據表,因為它包含一個不同的嗎txnAppId相比去年攝入數據相同的選項值。

警告

這個解決方案假設數據寫入三角洲表(s)在多個重試的工作是一樣的。如果δ表中寫入嚐試成功但由於一些下遊失敗還有第二個嚐試時候選項相同,但是不同的數據寫上去的,那麼第二次寫嚐試將被忽略。這可能會導致意想不到的結果。

例子

app_id=#一個獨一無二的字符串用作應用程序ID。版本=#一個單調遞增數字,充當事務的版本。dataFrame格式()選項(“txnVersion”,版本)選項(“txnAppId”,app_id)保存()
瓦爾appId=/ /一個獨一無二的字符串用作應用程序ID。版本=/ /一個單調遞增數字,充當事務的版本。dataFrame格式(…)。選項(“txnVersion”,版本)。選項(“txnAppId”,appId)。保存(…)

設置用戶定義元數據提交

您可以指定用戶定義的字符串作為元數據提交由這些操作,或者使用DataFrameWriter選項userMetadata或SparkSession配置spark.databricks.delta.commitInfo.userMetadata。如果他們被指定,那麼選擇偏好。這個定義的元數據是可讀的曆史操作。

火花δcommitInfouserMetadata=覆蓋- - - - - -- - - - - -修複- - - - - -不正確的- - - - - -數據插入覆蓋默認的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_namenested_col_namedata_type(評論col_comment](第一個|colA_name),…)
例子

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

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

後的模式是:

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

請注意

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

改變列的評論或排序

改變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

取代列

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

當運行以下DDL:

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

如果之前的模式是:

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

後的模式是:

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

重命名列

預覽

這個特性是在公共預覽

請注意

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

重命名列不重寫任何列的現有數據,您必須啟用列映射表。看到三角洲列映射

重命名一個列:

改變table_name重命名old_col_namenew_col_name

重命名一個嵌套的字段:

改變table_name重命名col_nameold_nested_fieldnew_nested_field
例子

當您運行以下命令:

改變盒子重命名colBfield1field001

如果之前的模式是:

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

之後的模式是:

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

看到三角洲列映射

刪除列

預覽

這個特性是在公共預覽

請注意

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

刪除列僅元數據操作,而無需重新編寫任何數據文件,您必須啟用列映射表。看到三角洲列映射

重要的

刪除一列從元數據不會刪除列的底層數據文件。清除掉列數據,您可以使用REORG表修改文件。然後,您可以使用真空物理上刪除的文件包含了列數據。

放棄一個列:

改變table_name下降col_name

將多個列:

改變table_name下降(col_name_1,col_name_2)

改變列類型或名稱

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

改變一個列類型
火花()\withColumn(“生日”,上校(“生日”)(“日期”))\\格式(“δ”)\模式(“覆蓋”)選項(“overwriteSchema”,“真正的”)\saveAsTable()
改變一個列名
火花()\withColumnRenamed(“dateOfBirth”,“生日”)\\格式(“δ”)\模式(“覆蓋”)\選項(“overwriteSchema”,“真正的”)\saveAsTable()

自動模式更新

三角洲湖可以自動更新表的模式作為DML事務的一部分(附加或重寫),使模式兼容正在寫入的數據。

添加列

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

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

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

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

請注意

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

NullType

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

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

替換表模式

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

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

表意見

三角洲湖支持創建視圖的三角洲表就像你可能會與一個數據源表。

這些視圖集成訪問控製表允許列和行級安全。

當你和視圖操作的核心挑戰是解決模式。如果你改變一個增量表模式,你必須重新創建導數觀點占任何添加模式。例如,如果你添加一個新的列到三角洲表,您必須確保這個專欄有適當的基表的視圖之上。

表屬性

你可以存儲自己的元數據表屬性使用TBLPROPERTIES創建改變。然後,您可以顯示元數據。例如:

改變默認的people10mTBLPROPERTIES(“部門”=“會計”,“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文件係統配置DataFrameReaderDataFrameWriter選項(即選擇鍵開始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文件係統配置為您的存儲數據源

筆記本

例如各種三角洲表的元數據命令,見以下筆記本的終結:

三角洲湖批處理命令的筆記本

在新標簽頁打開筆記本