教程:三角洲湖
本教程介绍了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
有关使用的详细资料真空
有效地,看用吸尘器清除未使用的数据文件.