Spark递归读取ADLS JSON文件时抛出URISyntaxException异常排查
解决Spark读取ADLS递归JSON文件时的URISyntaxException异常
可能的原因
- ADLS挂载路径下的部分文件夹/文件名包含特殊字符(如空格、%、&、中文等),导致URI解析失败
- Spark的
recursiveFileLookup与pathGlobFilter组合在ADLS挂载路径下存在兼容性问题 - DBFS挂载ADLS的路径配置存在潜在的URI解析冲突
解决办法
1. 排查并清理特殊字符
检查ADLS中A目录下所有子文件夹及JSON文件的名称,确保没有空格、中文、%、#这类特殊字符。ADLS对路径字符的要求比S3更严格,特殊字符会触发URI语法错误。
2. 替换路径写法,使用ADLS原生URI
放弃DBFS挂载路径,直接使用ADLS Gen2的原生abfss协议路径,例如:
sourceFilepath = 'abfss://your-container@your-storage-account.dfs.core.windows.net/A'
这种方式绕开DBFS挂载的URI解析环节,直接与ADLS交互,避免挂载带来的路径问题。
3. 调整Spark读取参数组合
改用通配符递归匹配文件,替代recursiveFileLookup和pathGlobFilter:
def json_parquet(sourceFilePath): df=(spark.read.format("json") .option("multiline",True) .load(sourceFilePath)) # 用**递归匹配所有子目录下的json文件 sourceFilepath='dbfs:/mnt/pp-working-1/A/**/*.json' json_parquet(sourceFilepath)
这种写法更直接,避免两个参数组合在ADLS上的兼容性问题。
4. 检查ADLS挂载配置
确认DBFS挂载ADLS的命令是否正确,比如挂载时是否使用了正确的绝对路径,没有引入相对路径错误。例如挂载命令应该类似:
dbutils.fs.mount( source = "abfss://container@storageaccount.dfs.core.windows.net/", mount_point = "/mnt/pp-working-1", extra_configs = {"fs.azure.account.key.storageaccount.dfs.core.windows.net": "your-access-key"} )
确保挂载源是ADLS的根路径,挂载点是绝对路径,没有语法错误。
内容的提问来源于stack exchange,提问作者hari kamatala
相关产品推荐
相关产品推荐

