教程:三角洲湖
本教程介紹了Databricks上常見的Delta Lake操作,包括以下內容:
您可以在一個數據庫中運行本文中的示例Python、R、Scala和SQL代碼筆記本連接到數據庫集群.還可以在數據庫中運行本文中的SQL代碼查詢關聯於SQL倉庫在磚的SQL.
請注意
下麵的一些代碼示例使用由模式(也稱為數據庫)和表或視圖組成的兩級名稱空間表示法(例如,default.people10m
).用這些例子統一目錄,將兩級命名空間替換為由目錄、模式和表或視圖組成的三級命名空間表示法(例如,main.default.people10m
).
創建表
Databricks上創建的所有表默認使用Delta Lake。
請注意
Delta Lake是Databricks Runtime 8.0及以上版本中所有讀、寫和表創建命令的默認值。您可以使用δ
關鍵字指定格式,如果使用Databricks Runtime 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米.δ`;
以上操作將創建一個新的管理表通過使用從數據推斷出的模式。有關創建Delta表時可用選項的信息,請參見創建表.
對於托管表,Databricks確定數據的位置。要獲取位置,可以使用描述的細節語句,例如:
顯示(火花.sql(描述詳細people_10m))
顯示(sql(“描述詳細people_10m”))
顯示(火花.sql(“描述詳細people_10m”))
描述細節people_10m;
有時,您可能希望在插入數據之前指定模式來創建表。你可以用SQL完成:
創建表格如果不存在people10m(idINT,firstName字符串,middleName字符串,姓字符串,性別字符串,生日時間戳,ssn字符串,工資INT)創建或取代表格people10m(idINT,firstName字符串,middleName字符串,姓字符串,性別字符串,生日時間戳,ssn字符串,工資INT)
你也可以使用DeltaTableBuilder
Delta Lake中的API來創建表。與DataFrameWriter API相比,該API更容易指定附加信息,如列注釋、表屬性和生成的列.
預覽
此功能已在公共預覽.
請注意
此特性在Databricks Runtime 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”).執行()
插入到一個表
要將一組更新和插入合並到現有的Delta表中,可以使用合並成聲明。例如,下麵的語句從源表中獲取數據並將其合並到目標Delta表中。當兩個表中都有匹配的行時,Delta Lake使用給定的表達式更新數據列。當沒有匹配的行時,Delta Lake會添加一個新行。這個操作被稱為插入.
創建或取代臨時視圖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
讀表格
通過表名或表路徑訪問Delta表中的數據,示例如下:
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;選擇*從δ.' <路徑-來-表格`;
寫入表
Delta Lake使用標準語法向表中寫入數據。
若要原子地向現有Delta表添加新數據,請使用附加
模式,示例如下:
插入成people10m選擇*從more_people
df.寫.模式(“添加”).saveAsTable(“people10m”)
df.寫.模式(“添加”).saveAsTable(“people10m”)
若要原子地替換表中的所有數據,請使用覆蓋
模式,示例如下:
插入覆蓋表格people10m選擇*從more_people
df.寫.模式(“覆蓋”).saveAsTable(“people10m”)
df.寫.模式(“覆蓋”).saveAsTable(“people10m”)
更新表
可以更新與Delta表中的謂詞匹配的數據。例如,在一個名為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格式的字符串聲明謂詞。deltaTable.更新(條件="性別= 'F'",集={“性別”:“女”})使用Spark SQL函數聲明謂詞。deltaTable.更新(條件=上校(“性別”)= =“米”,集={“性別”:點燃(“男”)})
進口io.δ.表._瓦爾deltaTable=DeltaTable.forPath(火花,“/ tmp /δ/ people-10m”)//使用sql格式的字符串聲明謂詞。deltaTable.updateExpr("性別= 'F'",地圖(“性別”->“女”)進口org.apache.火花.sql.功能._進口火花.值得一提的._//使用Spark SQL函數和隱式來聲明謂詞。deltaTable.更新(上校(“性別”)= = =“M”,地圖(“性別”->點燃(“男性”)));
從表中刪除
可以從Delta表中刪除與謂詞匹配的數據。例如,在一個名為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格式的字符串聲明謂詞。deltaTable.刪除("出生日期< '1955-01-01'")使用Spark SQL函數聲明謂詞。deltaTable.刪除(上校(“生日”)<“1960-01-01”)
進口io.δ.表._瓦爾deltaTable=DeltaTable.forPath(火花,“/ tmp /δ/ people-10m”)//使用sql格式的字符串聲明謂詞。deltaTable.刪除("出生日期< '1955-01-01'")進口org.apache.火花.sql.功能._進口火花.值得一提的._//使用Spark SQL函數和隱式來聲明謂詞。deltaTable.刪除(上校(“生日”)<“1955-01-01”)
重要的
刪除
從Delta表的最新版本中刪除數據,但不會從物理存儲中刪除數據,直到顯式地清空舊版本。看到真空獲取詳細信息。
查詢表的早期版本(時間旅行)
Delta Lake時間旅行允許您查詢Delta表的舊快照。
類中指定版本或時間戳,可查詢表的舊版本選擇
聲明。例如,要從上麵的曆史記錄中查詢版本0,使用:
選擇*從people_10m版本作為的0
orgydF4y2Ba
選擇*從people_10m時間戳作為的“2019-01-29 00:37:58”
對於時間戳,隻接受日期或時間戳字符串,例如,“2019-01-01”
而且“2019 - 01 - 01 - 00:00:00.000Z”
.
DataFrameReader選項允許你從固定到特定版本的Delta表中創建一個DataFrame,例如在Python中:
df1=火花.讀.格式(“δ”).選項(“timestampAsOf”,“2019-01-01”).表格(“people_10m”)顯示(df1)
或者,交替:
df2=火花.讀.格式(“δ”).選項(“versionAsOf”,0).表格(“people_10m”)顯示(df2)
詳細信息請參見工作與三角洲湖表曆史.
按列的z軸順序
為了進一步提高讀取性能,您可以通過z - order在同一組文件中同時定位相關信息。Delta Lake數據跳過算法自動使用這種共局部性,以顯著減少需要讀取的數據量。類中指定要排序的列ZORDER通過
條款。例如,與…共同定位性別
運行:
優化people_10mZORDER通過(性別)
獲取運行時可用的全套選項優化
,請參閱緊湊的數據文件與優化三角洲湖.
使用真空
Delta Lake為讀取提供快照隔離,這意味著它可以安全運行優化
即使其他用戶或作業正在查詢表。但是,您最終應該清理舊快照。可以通過運行真空
命令:
真空people_10m
有關使用的詳細資料真空
有效地,看用吸塵器清除未使用的數據文件.