教程:三角洲湖

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

您可以運行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)

在磚運行時13.0及以上的,你可以使用創建就像創建一個新的空三角洲表複製模式和表源三角洲的屬性表。這可以促進表時特別有用的開發環境投入生產,如以下代碼示例:

創建刺激people10m就像devpeople10m

您還可以使用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

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