在这种情况下,我从blob存储中读取文件,然后在Azure Databricks中创建一个delta表。当您在Datbaricks中创建增量表时,默认情况下会创建一些我们无法访问的增量文件。
另一种方法是创建一个非托管的delta表,并指定自己的路径来存储这些delta文件。我想知道怎么做。如何指定要将增量文件存储在何处。这个外部表是什么意思,我如何指定外部表的路径?我尝试了以下代码,但在创建外部表命令时失败:
spark.conf.set("fs.azure.account.auth.type.xyzstorageaccount.dfs.core.windows.net", "SAS")
spark.conf.set("fs.azure.sas.token.provider.type.xyzstorageaccount.dfs.core.windows.net", "org.apache.hadoop.fs.azurebfs.sas.FixedSASTokenProvider")
spark.conf.set("fs.azure.sas.fixed.token.xyzstorageaccount.dfs.core.windows.net", "<sas token>")
%sql
CREATE EXTERNAL TABLE IF NOT EXISTS axytable
LOCATION 'abfss://xyzstorageaccount/tables';
我知道我可能在这里做错了什么,我还没有完全理解外部表的实际含义。。它是否留在Databricks集群内,而不是提供我的存储帐户路径,我是否应该提供Databrickss路径?我如何创建一个自定义目录,这似乎也是这里的一个要求?此外,此代码在这里有效,我可以按照提供的路径将其写入存储帐户,但我不理解。有SME可以在这里帮助我吗?
path = "abfss://xxx@xyzstorageacount.dfs.core.windows.net/XYY"
(DF.writeStream
.format('delta')
.outputMode("append")
.trigger(once=True)
.option("mergeSchema", "true")
.option('checkpointLocation', path+"/bronze_checkpoint")
.start(path + "/myTable"))
本文档很好地描述了托管表是什么以及它们与非托管表的区别。简而言之,托管表是在";默认";位置以及数据&表元数据由Hive元存储或Unity Catalog管理,因此当您删除表时,实际数据也会被删除。非托管表不同,因为只有元数据由Hive元存储或Unity Catalog控制——如果删除表,则只会删除表定义,而不会删除数据。
您可以通过不同的方式创建未修改的表:
- 使用语法
create table <name> (columns definition) using delta location 'path'
(doc(从头开始创建 - 使用语法
create table name using delta location 'path'
为现有数据创建表(不需要提供列定义((doc( - 使用
saveAsTable
(用于批处理(或toTable
(流式传输(保存表时,为path
选项提供数据路径。在您的示例中,它将如下所示:
path = "abfss://xxx@xyzstorageacount.dfs.core.windows.net/XYY"
(DF.writeStream
.format('delta')
.outputMode("append")
.trigger(once=True)
.option("mergeSchema", "true")
.option('checkpointLocation', path+"/bronze_checkpoint")
.option('path', path + "/myTable")
.toTable('<table_name>')
)