教程:三角洲湖

本教程介绍了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

有关使用的详细资料真空有效地,看用吸尘器清除未使用的数据文件