教程:三角洲湖
本教程介绍常见三角洲湖砖上的操作,包括以下:
您可以运行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
有关使用真空
有效地,看删除未使用的数据文件与真空。