教程:三角洲湖

本教程介紹了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”dfsaveAsTabletable_name
圖書館SparkRsparkR.session()#從數據源加載數據。dfread.df路徑“/ databricks-datasets / learning-spark-v2 /人/ people-10m.delta”#將數據寫入表。table_name“people_10m”saveAsTabledfdf的表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完成:

創建表格如果存在people10midINTfirstName字符串middleName字符串字符串性別字符串生日時間戳ssn字符串工資INT創建取代表格people10midINTfirstName字符串middleName字符串字符串性別字符串生日時間戳ssn字符串工資INT

你也可以使用DeltaTableBuilderDelta Lake中的API來創建表。與DataFrameWriter API相比,該API更容易指定附加信息,如列注釋、表屬性和生成的列

預覽

此功能已在公共預覽

請注意

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

插入到一個表

要將一組更新和插入合並到現有的Delta表中,可以使用合並成聲明。例如,下麵的語句從源表中獲取數據並將其合並到目標Delta表中。當兩個表中都有匹配的行時,Delta Lake使用給定的表達式更新數據列。當沒有匹配的行時,Delta Lake會添加一個新行。這個操作被稱為插入

創建取代臨時視圖people_updatesidfirstNamemiddleName性別生日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_10midpeople_updatesid匹配然後更新匹配然後插入

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

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

要查看結果,請查詢表。

選擇people_10m在哪裏id> =9999998

讀表格

通過表名或表路徑訪問Delta表中的數據,示例如下:

people_df火花表格table_name顯示people_df# #或people_df火花負載table_path顯示people_df
people_dftableToDFtable_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進口deltaTableDeltaTableforPath火花“/ tmp /δ/ people-10m”使用sql格式的字符串聲明謂詞。deltaTable更新條件"性別= 'F'"“性別”“女”使用Spark SQL函數聲明謂詞。deltaTable更新條件上校“性別”= =“米”“性別”點燃“男”
進口ioδ_瓦爾deltaTableDeltaTableforPath火花“/ tmp /δ/ people-10m”//使用sql格式的字符串聲明謂詞。deltaTableupdateExpr"性別= 'F'"地圖“性別”->“女”進口orgapache火花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進口deltaTableDeltaTableforPath火花“/ tmp /δ/ people-10m”使用sql格式的字符串聲明謂詞。deltaTable刪除"出生日期< '1955-01-01'"使用Spark SQL函數聲明謂詞。deltaTable刪除上校“生日”<“1960-01-01”
進口ioδ_瓦爾deltaTableDeltaTableforPath火花“/ tmp /δ/ people-10m”//使用sql格式的字符串聲明謂詞。deltaTable刪除"出生日期< '1955-01-01'"進口orgapache火花sql功能_進口火花值得一提的_//使用Spark SQL函數和隱式來聲明謂詞。deltaTable刪除上校“生日”<“1955-01-01”

重要的

刪除從Delta表的最新版本中刪除數據,但不會從物理存儲中刪除數據,直到顯式地清空舊版本。看到真空獲取詳細信息。

顯示表曆史

要查看表的曆史記錄,使用描述曆史語句,該語句為每次寫入表提供來源信息,包括表版本、操作、用戶等。

描述曆史people_10m

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

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

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

優化表

對表執行多次更改後,可能會有很多小文件。要提高讀查詢的速度,可以使用優化將小文件壓縮成大文件:

優化people_10m

按列的z軸順序

為了進一步提高讀取性能,您可以通過z - order在同一組文件中同時定位相關信息。Delta Lake數據跳過算法自動使用這種共局部性,以顯著減少需要讀取的數據量。類中指定要排序的列ZORDER通過條款。例如,與…共同定位性別運行:

優化people_10mZORDER通過性別

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

使用真空

Delta Lake為讀取提供快照隔離,這意味著它可以安全運行優化即使其他用戶或作業正在查詢表。但是,您最終應該清理舊快照。可以通過運行真空命令:

真空people_10m

有關使用的詳細資料真空有效地,看用吸塵器清除未使用的數據文件