如何在Azure Databricks中创建读取Azure Data Lake Store的EXTERNAL TABLE?
当然没问题!我经常帮用户实现这类需求——在Azure Databricks中创建外部表来读取Azure Data Lake Store(ADLS)里的CSV文件完全可行,下面我会把具体步骤和细节给你讲清楚:
前提:配置ADLS访问权限
首先得确保你的Databricks集群能访问目标ADLS文件夹,常用的两种配置方式:
- Service Principal(SP)认证:给SP分配
Storage Blob Data Contributor权限到ADLS的目标容器/文件夹,然后在Databricks集群或笔记本中配置SP的密钥(通过Azure Key Vault或者直接在代码中指定)。 - Azure AD Pass-through:如果你的Databricks集群启用了Azure AD身份传递,直接用你的AD账号权限访问即可,前提是你有ADLS文件夹的读取权限。
方法一:用Spark SQL创建外部表
这是最直接的方式,适合SQL优先的场景:
CREATE EXTERNAL TABLE IF NOT EXISTS my_csv_external_table ( user_id INT, user_name STRING, register_date DATE, total_amount DOUBLE ) USING csv OPTIONS ( header = "true", -- 如果CSV文件有表头就设为true delimiter = ",", quote = "\"", nullValue = "" ) LOCATION "abfss://your-container@your-datalake-account.dfs.core.windows.net/path/to/target-csv-folder/";
关键细节说明:
- 手动指定表的Schema比用
inferSchema=true更高效,尤其是处理大文件时,避免Spark全量扫描推断类型。 LOCATION里的路径要使用ADLS Gen2的abfss://协议;如果是ADLS Gen1,用adl://协议。- 外部表的元数据存在Databricks的Hive Metastore中,但源文件始终保存在ADLS里,删除表只会删除元数据,不会影响源文件。
方法二:用PySpark代码创建外部表
如果习惯用Python代码操作,可以通过DataFrame API来创建:
from pyspark.sql.types import StructType, StructField, IntegerType, StringType, DateType, DoubleType # 先定义CSV文件的结构 csv_schema = StructType([ StructField("user_id", IntegerType(), nullable=True), StructField("user_name", StringType(), nullable=True), StructField("register_date", DateType(), nullable=True), StructField("total_amount", DoubleType(), nullable=True) ]) # 读取CSV并创建外部表 spark.read \ .schema(csv_schema) \ .option("header", "true") \ .option("delimiter", ",") \ .csv("abfss://your-container@your-datalake-account.dfs.core.windows.net/path/to/target-csv-folder/") \ .write \ .mode("ignore") # 表已存在时跳过创建 .option("path", "abfss://your-container@your-datalake-account.dfs.core.windows.net/path/to/target-csv-folder/") \ .saveAsTable("my_csv_external_table")
小提醒:
saveAsTable方法只要指定了path参数,创建的就是外部表;如果不指定,会创建内部表(数据存在Databricks的存储中)。
额外注意事项
- 如果ADLS文件夹里有分区格式的CSV(比如按日期分区的
date=2024-01-01子文件夹),可以在创建表时添加分区字段,或者用partitionBy参数自动识别分区。 - 确保Databricks集群的网络能访问ADLS:如果ADLS设置了防火墙,需要把Databricks集群的IP加入允许列表,或者通过VNet peering打通网络。
内容的提问来源于stack exchange,提问作者datarocker
相关产品推荐
相关产品推荐

