Azure Databricks中用RDD API读取ADLS Gen2文件报错求助
解决Unity Catalog下RDD API读取ABFSS路径的认证问题
核心原因
启用Unity Catalog后,DataFrame API通过SparkSession自动继承UC的认证配置(如托管身份、服务主体凭据),但SparkContext(sc)的RDD API默认不会自动关联UC的认证体系,直接使用原始ABFSS URL会触发密钥配置错误。
解决方案
方案1:使用Unity Catalog外部位置引用(推荐)
既然已配置外部位置,直接通过UC的外部位置名称引用路径,无需手动管理密钥,RDD会自动通过UC的认证读取文件:
# 替换为你在UC中创建的外部位置名称 rdd_in = sc.textFile("/external-locations/my_external_location/RDD_testing/input.txt")
注:外部位置需提前在Unity Catalog中创建,示例创建语句:
CREATE EXTERNAL LOCATION my_external_location URL 'abfss://container_name@storage_account_name.dfs.core.windows.net/' WITH (CREDENTIAL my_uc_credential);
方案2:直接为SparkContext设置Hadoop认证配置
如果必须使用原始ABFSS URL,需直接修改SparkContext对应的Hadoop配置(而非仅SparkSession):
accessKey = 'my_access_key' # 直接设置Hadoop配置,而非SparkSession的conf sc._jsc.hadoopConfiguration().set( "fs.azure.account.key.storage_account_name.dfs.core.windows.net", accessKey ) # 再读取文件 rdd_in = sc.textFile('abfss://container_name@storage_account_name.dfs.core.windows.net/RDD_testing/input.txt')
方案3:挂载外部位置到DBFS
将ABFSS存储挂载到DBFS后,使用DBFS路径读取,RDD可直接识别:
# 先挂载(仅需执行一次) dbutils.fs.mount( source = "abfss://container_name@storage_account_name.dfs.core.windows.net/", mount_point = "/mnt/my_rdd_mount", extra_configs = {"fs.azure.account.key.storage_account_name.dfs.core.windows.net": accessKey} ) # 通过DBFS路径读取RDD rdd_in = sc.textFile("/mnt/my_rdd_mount/RDD_testing/input.txt")
内容的提问来源于stack exchange,提问作者Ken Masters
相关产品推荐
相关产品推荐

