教程:三角洲湖
本教程介紹常見三角洲湖磚上的操作,包括以下:
您可以運行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”df。寫。saveAsTable(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就像dev。people10m
您還可以使用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”)。執行()
插入一個表
合並一組更新和插入到現有δ表,您使用合並成聲明。例如,下麵的語句將數據從源表合並成目標三角洲表。當兩個表中有一個匹配的行,三角洲湖更新數據列使用給定的表達式。當沒有匹配的行,三角洲湖添加一個新行。該操作被稱為一個插入。
創建或取代臨時視圖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_updates在people_10m。id=people_updates。id當匹配然後更新集*當不匹配然後插入*;
如果您指定*
,這更新或插入目標表中的所有列。這假設源表具有相同的列的目標表,否則查詢將拋出一個錯誤分析。
你必須為每一列指定值表當您執行一個插入
操作(例如,當現有的數據集)中的沒有匹配的行。然而,你不需要更新所有的值。
看到結果,查詢該表。
選擇*從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=DeltaTable。forPath(火花,“/ tmp /δ/ people-10m”)#聲明使用SQL-formatted字符串謂詞。deltaTable。更新(條件=“性別= ' F '”,集={“性別”:“女”})#使用謂詞的火花SQL函數聲明。deltaTable。更新(條件=上校(“性別”)= =“米”,集={“性別”:點燃(“男”)})
進口io。δ。表。_瓦爾deltaTable=DeltaTable。forPath(火花,“/ tmp /δ/ people-10m”)/ /聲明使用SQL-formatted字符串謂詞。deltaTable。updateExpr(“性別= ' F '”,地圖(“性別”- >“女”)進口org。apache。火花。sql。功能。_進口火花。值得一提的。_/ /聲明使用火花值得一提的是SQL函數和謂詞。deltaTable。更新(上校(“性別”)= = =“M”,地圖(“性別”- >點燃(“男性”)));
刪除從表
您可以刪除數據匹配謂詞從三角洲表。例如,在一個表命名people10m
或一個路徑/ tmp /δ/ people-10m
刪除所有行對應於人的價值生日
之前的列1955年
,您可以運行下麵的:
刪除從people10m在哪裏生日<“1955-01-01”刪除從δ。' /tmp/δ/人- - - - - -10米”在哪裏生日<“1955-01-01”
從delta.tables進口*從pyspark.sql.functions進口*deltaTable=DeltaTable。forPath(火花,“/ tmp /δ/ people-10m”)#聲明使用SQL-formatted字符串謂詞。deltaTable。刪除(“生日< 1955-01-01”)#使用謂詞的火花SQL函數聲明。deltaTable。刪除(上校(“生日”)<“1960-01-01”)
進口io。δ。表。_瓦爾deltaTable=DeltaTable。forPath(火花,“/ tmp /δ/ people-10m”)/ /聲明使用SQL-formatted字符串謂詞。deltaTable。刪除(“生日< 1955-01-01”)進口org。apache。火花。sql。功能。_進口火花。值得一提的。_/ /聲明使用火花值得一提的是SQL函數和謂詞。deltaTable。刪除(上校(“生日”)<“1955-01-01”)
重要的
刪除
從三角洲的最新版本中刪除數據表,但不刪除它從物理存儲到舊版本明確真空的。看到真空獲取詳細信息。
查詢的一個早期版本表(時間旅行)
三角洲湖時間旅行允許您查詢一個年長的三角洲表的快照。
查詢一個舊版本的表,指定一個版本或時間戳選擇
聲明。例如,要從曆史查詢版本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)
有關詳細信息,請參見工作與三角洲湖表的曆史。
z值的列
為了進一步提高讀取性能,您可以在同一組共同部署相關信息由z值的文件。自動使用這個co-locality三角洲湖data-skipping算法極大地減少了需要讀取的數據量。z值數據,在指定的列順序ZORDER通過
條款。例如,在同一個地點協同工作性別
運行:
優化people_10mZORDER通過(性別)
全套的運行時選項優化
,請參閱緊湊的數據文件與優化在三角洲湖。
清理與快照真空
三角洲湖為閱讀提供了快照隔離,這意味著它是安全的優化
盡管其他用戶或工作表查詢。然而,最終你應該清理舊的快照。你可以通過運行真空
命令:
真空people_10m
有關使用真空
有效地,看刪除未使用的數據文件與真空。