如何在现有数据库之上创建具有只读访问权限的数据块数据库

How to create a databricks database with read only access on top of an existing database

我将使用这张图片来形象化我的问题:

Databricks1 在 Databricks 中创建一个数据库(和 tables)并将其数据存储在存储帐户中。在 Databricks2 中,我想读取数据:Databricks2 只有读取权限。我可以直接读取原始增量文件,但我想创建一个数据库和 table,它也在 Databricks UI 中可视化。 我认为它会按以下方式工作:

CREATE DATABASE IF NOT EXISTS datastore_panels
LOCATION '/mnt/readOnlyTraining/tmp/panels/'; 

但这会导致权限错误,尽管 tmp/panels 数据库已经存在。

有没有一种方法可以在 delta 之上从现有资源创建具有只读访问权限的 database/table?

我找到了解决办法。我在这上面浪费了很多时间,而且我从未遇到过有同样问题的人。

解决方法其实很简单,但是你需要知道。 我有一个对我的存储帐户具有读取权限的服务主体。

像这样创建数据库(不要提及位置):

CREATE DATABASE IF NOT EXISTS datastore_panels

创建 table(使用位置,但不设置 table 属性或分区:它将从增量 table 元数据中读取):

CREATE TABLE IF NOT EXISTS datastore_panels.customer_data
USING delta
LOCATION '/mnt/readOnlyTraining/delta/customer-data/'

对于那些想更好地理解问题的人,这是我之前尝试过的

   %sql
CREATE TABLE IF NOT EXISTS datastore_panels.production_bazeilles_press_shopfloor (
      reg_id INT,
      year INT,
      timestamp_utc TIMESTAMP,
      unit STRING,
      value DECIMAL (18,8),
      descr_total STRING,
      descr01 STRING,
      descr02 STRING,
      descr03 STRING,
      descr04 STRING,
      descr05 STRING,
      descr06 STRING,
      descr07 STRING,
      descr08 STRING,
      descr09 STRING,
      descr10 STRING
)
USING delta
PARTITIONED BY (year)
LOCATION '/mnt/blob/panels/production/bazeilles/press/shopfloor'
TBLPROPERTIES ('delta.deletedFileRetentionDuration' = "interval 60 days",
              'delta.autoOptimize.optimizeWrite' = 'true'
)

这不起作用,因为 spark 最终将只读,但由于指定的列,tblproperties 和 partitionedby spark 需要登录到只有读访问权限的存储帐户,有人试图更改这些属性。这个记录步骤是不可能的,所以它返回一个 "no permission" 错误。

我们遇到了类似的情况,我们在 ADLS 上创建了一个具有“存储读取访问权限”的服务主体,并将数据块 1 位置安装到具有只读服务主体的数据块 2。但是,我们还需要 运行 一个自动化脚本来根据新的安装位置在数据块 2 中自动创建 tables。

虽然,我们遇到了一个问题,如果不同的组想要访问同一数据块帐户(数据块 1)中的相同 tables 怎么办:1 组具有读取和写入功能,而其他组具有读取功能只要。而且我们不需要另一个服务主体,因为我们想为组提供 table 名称而不是 table 位置。类似于数据库中的数据库ACL来管理权限。