azure - 在 Azure databricks 中创建外部表

标签 azure hive databricks azure-databricks external-tables

我是 azure databricks 的新手,并尝试创建一个外部表,指向 Azure Data Lake Storage (ADLS) Gen-2 位置。

在 databricks 笔记本中,我尝试设置 ADLS 访问的 Spark 配置。我仍然无法执行创建的 DDL。

注意:对我有用的一种解决方案是将 ADLS 帐户安装到集群,然后使用外部表的 DDL 中的安装位置。但我需要检查是否可以使用 ADLS 路径创建没有安装位置的外部表 DDL。

# Using Principal credentials
spark.conf.set("dfs.azure.account.auth.type", "OAuth")
spark.conf.set("dfs.azure.account.oauth.provider.type", "ClientCredential")
spark.conf.set("dfs.azure.account.oauth2.client.id", "client_id")
spark.conf.set("dfs.azure.account.oauth2.client.secret", "client_secret")
spark.conf.set("dfs.azure.account.oauth2.client.endpoint", 
"https://login.microsoftonline.com/tenant_id/oauth2/token")

DDL

create external table test(
id string,
name string
)
partitioned by (pt_batch_id bigint, pt_file_id integer)
STORED as parquet
location 'abfss://container@account_name.dfs.core.windows.net/dev/data/employee

收到错误

Error in SQL statement: AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: MetaException(message:Got exception: shaded.databricks.v20180920_b33d810.org.apache.hadoop.fs.azurebfs.contracts.exceptions.ConfigurationPropertyNotFoundException Configuration property account_name.dfs.core.windows.net not found.);

我需要帮助了解是否可以直接在 DDL 中引用 ADLS 位置?

谢谢。

最佳答案

如果您可以使用 Python(或 Scala),就差不多了。

首先建立连接:

TenantID = "blah"

def connectLake():
  spark.conf.set("fs.azure.account.auth.type", "OAuth")
  spark.conf.set("fs.azure.account.oauth.provider.type", "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider")
  spark.conf.set("fs.azure.account.oauth2.client.id", dbutils.secrets.get(scope = "LIQUIX", key = "lake-sp"))
  spark.conf.set("fs.azure.account.oauth2.client.secret", dbutils.secrets.get(scope = "LIQUIX", key = "lake-key"))
  spark.conf.set("fs.azure.account.oauth2.client.endpoint", "https://login.microsoftonline.com/"+TenantID+"/oauth2/token")

connectLake()
lakePath = "abfss://<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b5d9dcc4c0dccdf5d8ccc6c1dac7d4d2d0d4d6d6dac0dbc19bd1d3c69bd6dac7d09bc2dcdbd1dac2c69bdbd0c1" rel="noreferrer noopener nofollow">[email protected]</a>/"

使用 Python,您可以使用以下方式注册表:

spark.sql("CREATE TABLE DimDate USING PARQUET LOCATION '"+lakePath+"/PRESENTED/DIMDATE/V1'")

如果您已执行 connectLake() 函数,您现在可以查询该表 - 这在您当前的 session /笔记本中没问题。

现在的问题是,如果有新 session 进入并且他们尝试从该表中选择 * ,除非他们首先运行 connectLake() 函数,否则它将失败。没有办法绕过这个限制,因为您必须证明访问该湖的凭据。

您可能需要考虑 ADLS Gen2 凭据传递:https://docs.azuredatabricks.net/spark/latest/data-sources/azure/adls-passthrough.html

请注意,这需要使用高并发集群。

关于azure - 在 Azure databricks 中创建外部表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56792095/

相关文章:

r - 在 Azure ML 中安装 R 包

c# - CustomVision API 返回 "Operation returned an invalid status code: ' NotFound'"

hadoop - "Hello World !"用于 hadoop/hbase?

Azure Databricks 群集初始化脚本 - 从已安装的存储安装wheel

sql - 为什么 Azure Databricks 中的时间格式发生变化

c# - 是否可以在 Azure Web 角色中运行 F# WebApi (OWIN) 项目?

visual-studio-2012 - 将 blob 上传到 azure

token TOK_TMP_FILE 附近遇到 Hive 查询错误

hadoop - java.lang.OutOfMemoryError : unable to create new native thread for big data set 错误

python - 使用 SQlcontext 在 spark 中加载我的 csv 时出错