教程:三角洲湖

本教程介紹常見三角洲湖磚上的操作,包括以下:

您可以運行Python的例子中,R, Scala,本文從內部的SQL代碼筆記本附加到一個磚集群。你也可以從內部運行本文中的SQL代碼查詢關聯到一個SQL倉庫磚的SQL

請注意

下麵的代碼示例使用兩級的一些命名空間符號組成的一個模式(也稱為一個數據庫)和一個表或視圖(例如,default.people10m)。使用這些示例統一目錄,更換二級與三級統一目錄名稱空間名稱空間符號組成的一個目錄,模式和表或視圖(例如,main.default.people10m)。

創建一個表

所有表上創建數據磚使用默認三角洲湖。

請注意

三角洲湖是默認為所有的讀,寫,在磚和表創建命令運行時8.0及以上。您可以使用δ關鍵字指定格式如果使用運行時7.3 LTS磚。

#從源頭裝載數據。df=火花負載(“/ databricks-datasets / learning-spark-v2 /人/ people-10m.delta”)#寫數據表。table_name=“people_10m”dfsaveAsTable(table_name)
圖書館(SparkR)sparkR.session()#從源頭裝載數據。df=read.df(路徑=“/ databricks-datasets / learning-spark-v2 /人/ people-10m.delta”)#寫數據表。table_name=“people_10m”saveAsTable(df=df,的表=table_name)
/ /加載數據從其來源。瓦爾=火花負載(“/ databricks-datasets / learning-spark-v2 /人/ people-10m.delta”)/ /寫數據表。瓦爾table_name=“people_10m”saveAsTable(“people_10m”)
下降如果存在people_10m;創建如果存在people_10m作為選擇*δ' /- - - - - -數據集/學習- - - - - -火花- - - - - -v2//- - - - - -10δ;

前麵的操作創建一個新的管理表通過從數據推斷的模式。信息可用選項創建一個增量表時,看到的創建表

對於管理表,磚決定數據的位置。的位置,您可以使用描述的細節語句,例如:

顯示(火花sql(“描述細節people_10m”))
顯示(sql(“描述細節people_10m”))
顯示(火花sql(“描述細節people_10m”))
描述細節people_10m;

有時候您可能想要創建一個表插入數據之前通過指定的模式。你可以用SQL完成這個:

創建如果存在people10m(idINT,firstName字符串,middleName字符串,字符串,性別字符串,生日時間戳,ssn字符串,工資INT)創建取代people10m(idINT,firstName字符串,middleName字符串,字符串,性別字符串,生日時間戳,ssn字符串,工資INT)

您還可以使用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”)執行()

插入一個表

合並一組更新和插入到現有δ表,您使用合並成聲明。例如,下麵的語句將數據從源表合並成目標三角洲表。當兩個表中有一個匹配的行,三角洲湖更新數據列使用給定的表達式。當沒有匹配的行,三角洲湖添加一個新行。該操作被稱為一個插入

創建取代臨時視圖people_updates(id,firstName,middleName,,性別,生日,ssn,工資)作為(9999998,“比利”,“湯米·”,“Luppitt”,“米”,1992 - 09 - 17 t04:00:00.000 + 0000的,“953-38-9452”,55250年),(9999999,“伊萊亞斯”,“西裏爾”,“利百特”,“米”,1984 - 05 - 22 t04:00:00.000 + 0000的,“906-51-2137”,48500年),(10000000,“約書亞”,‘底盤’,“Broggio”,“米”,1968 - 07 - 22 t04:00:00.000 + 0000的,“988-61-6247”,90000年),(20000001,“約翰。”,,“母鹿”,“米”,1978 - 01 - 14 - t04:00:00.000 + 000的,“345-67-8901”,55500年),(20000002,“瑪麗”,,“史密斯”,“F”,1982 - 10 - 29 t01:00:00.000 + 000,“456-78-9012”,98250年),(20000003,“簡”,,“母鹿”,“F”,1981 - 06 - 25 - t04:00:00.000 + 000的,“567-89-0123”,89900年);合並people_10m使用people_updatespeople_10mid=people_updatesid匹配然後更新*匹配然後插入*;

如果您指定*,這更新或插入目標表中的所有列。這假設源表具有相同的列的目標表,否則查詢將拋出一個錯誤分析。

你必須為每一列指定值表當您執行一個插入操作(例如,當現有的數據集)中的沒有匹配的行。然而,你不需要更新所有的值。

看到結果,查詢該表。

選擇*people_10m在哪裏id> =9999998

讀一個表

你訪問數據在三角洲表的表名或表路徑,如以下示例所示:

people_df=火花(table_name)顯示(people_df)# #或people_df=火花負載(table_path)顯示(people_df)
people_df=tableToDF(table_name)顯示(people_df)
瓦爾people_df=火花(table_name)顯示(people_df)\ \orgydF4y2Ba瓦爾people_df=火花負載(table_path)顯示(people_df)
選擇*people_10m;選擇*δ' <路徑- - - - - -- - - - - -;

寫一個表

三角洲湖使用標準語法寫入數據表。

自動將新數據添加到現有的差值表,使用附加模式,下麵的例子:

插入people10m選擇*more_people
df模式(“添加”)saveAsTable(“people10m”)
df模式(“添加”)。saveAsTable(“people10m”)

自動替換表中的所有數據,使用覆蓋模式,下麵的例子:

插入覆蓋people10m選擇*more_people
df模式(“覆蓋”)saveAsTable(“people10m”)
df模式(“覆蓋”)。saveAsTable(“people10m”)

更新一個表

你可以更新數據相匹配的謂詞在三角洲表。例如,在一個表命名people10m或一個路徑/ tmp /δ/ people-10m,改變的縮寫性別列從orgydF4y2BaF男性orgydF4y2Ba,您可以運行下麵的:

更新people10m性別=“女”在哪裏性別=“F”;更新people10m性別=“男”在哪裏性別=“米”;更新δ' /tmp/δ/- - - - - -10性別=“女”在哪裏性別=“F”;更新δ' /tmp/δ/- - - - - -10性別=“男”在哪裏性別=“米”;
delta.tables進口*pyspark.sql.functions進口*deltaTable=DeltaTableforPath(火花,“/ tmp /δ/ people-10m”)#聲明使用SQL-formatted字符串謂詞。deltaTable更新(條件=“性別= ' F '”,={“性別”:“女”})#使用謂詞的火花SQL函數聲明。deltaTable更新(條件=上校(“性別”)= =“米”,={“性別”:點燃(“男”)})
進口ioδ_瓦爾deltaTable=DeltaTableforPath(火花,“/ tmp /δ/ people-10m”)/ /聲明使用SQL-formatted字符串謂詞。deltaTableupdateExpr(“性別= ' F '”,地圖(“性別”- >“女”)進口orgapache火花sql功能_進口火花值得一提的_/ /聲明使用火花值得一提的是SQL函數和謂詞。deltaTable更新(上校(“性別”)= = =“M”,地圖(“性別”- >點燃(“男性”)));

刪除從表

您可以刪除數據匹配謂詞從三角洲表。例如,在一個表命名people10m或一個路徑/ tmp /δ/ people-10m刪除所有行對應於人的價值生日之前的列1955年,您可以運行下麵的:

刪除people10m在哪裏生日<“1955-01-01”刪除δ' /tmp/δ/- - - - - -10在哪裏生日<“1955-01-01”
delta.tables進口*pyspark.sql.functions進口*deltaTable=DeltaTableforPath(火花,“/ tmp /δ/ people-10m”)#聲明使用SQL-formatted字符串謂詞。deltaTable刪除(“生日< 1955-01-01”)#使用謂詞的火花SQL函數聲明。deltaTable刪除(上校(“生日”)<“1960-01-01”)
進口ioδ_瓦爾deltaTable=DeltaTableforPath(火花,“/ tmp /δ/ people-10m”)/ /聲明使用SQL-formatted字符串謂詞。deltaTable刪除(“生日< 1955-01-01”)進口orgapache火花sql功能_進口火花值得一提的_/ /聲明使用火花值得一提的是SQL函數和謂詞。deltaTable刪除(上校(“生日”)<“1955-01-01”)

重要的

刪除從三角洲的最新版本中刪除數據表,但不刪除它從物理存儲到舊版本明確真空的。看到真空獲取詳細信息。

顯示表的曆史

查看表的曆史,使用描述曆史表聲明,它提供了來源的信息,包括版本,操作,用戶,等等,每個寫一個表。

描述曆史people_10m

查詢的一個早期版本表(時間旅行)

三角洲湖時間旅行允許您查詢一個年長的三角洲表的快照。

查詢一個舊版本的表,指定一個版本或時間戳選擇聲明。例如,要從曆史查詢版本0以上,使用:

選擇*people_10m版本作為0

orgydF4y2Ba

選擇*people_10m時間戳作為“2019-01-29 00:37:58”

時間戳,隻接受日期或時間戳字符串,例如,“2019-01-01”“2019 - 01 - 01 - 00:00:00.000Z”

DataFrameReader選項允許你創建一個從三角洲DataFrame表是固定到一個特定版本的表,例如在Python中:

df1=火花格式(“δ”)選項(“timestampAsOf”,“2019-01-01”)(“people_10m”)顯示(df1)

或者,交替:

df2=火花格式(“δ”)選項(“versionAsOf”,0)(“people_10m”)顯示(df2)

有關詳細信息,請參見工作與三角洲湖表的曆史

優化一個表

一旦完成多個更改一個表,你可能會有很多小文件。提高閱讀的速度查詢,您可以使用優化崩潰的小文件到較大的:

優化people_10m

z值的列

為了進一步提高讀取性能,您可以在同一組共同部署相關信息由z值的文件。自動使用這個co-locality三角洲湖data-skipping算法極大地減少了需要讀取的數據量。z值數據,在指定的列順序ZORDER通過條款。例如,在同一個地點協同工作性別運行:

優化people_10mZORDER通過(性別)

全套的運行時選項優化,請參閱緊湊的數據文件與優化在三角洲湖

清理與快照真空

三角洲湖為閱讀提供了快照隔離,這意味著它是安全的優化盡管其他用戶或工作表查詢。然而,最終你應該清理舊的快照。你可以通過運行真空命令:

真空people_10m

有關使用真空有效地,看刪除未使用的數據文件與真空