Spark操作Azure Data Lake Gen2时出现日期解析报错如何解决?
解决Spark读取Azure Data Lake Gen2时的日期解析报错问题
该报错属于hadoop-azure依赖包的已知兼容性问题:Azure存储服务返回的文件元数据中HTTP日期头的格式,和当前使用的hadoop-azure版本内置的日期解析器预期格式不匹配。报错出现在元数据拉取的非核心路径,所以不会影响实际的文件读写逻辑,仅会在日志中抛出错误信息。
解决方法
方法1:升级对应依赖版本(推荐)
将Spark配套的hadoop-azure、azure-storage依赖包升级到修复后的版本:
- 如果你使用Spark 3.x + Hadoop 3.3.x 及以上版本,将
hadoop-azure升级到3.3.4及以上即可,该版本官方已经兼容了多种HTTP日期格式的解析逻辑。
方法2:新增Spark配置适配
如果不方便升级依赖,可以直接在SparkConf中新增对应配置,要么禁用日期解析校验,要么手动指定日期格式:
from pyspark import SparkConf from pyspark.sql import SparkSession # create spark session key = "some_key" appName = "DataExtract" master = "local[*]" sparkConf = SparkConf() \ .setAppName(appName) \ .setMaster(master) \ .set("fs.azure.account.key.myaccount.dfs.core.windows.net", key) \ # 可选配置1:直接禁用非必要的最后修改时间解析,不影响正常读写 .set("fs.azure.disable.last.modified.time.parse", "true") \ # 可选配置2:手动指定匹配的日期格式,注意需保证运行环境locale为英文,避免月份缩写解析失败 # .set("fs.azure.date.format", "EEE, dd MMM yyyy HH:mm:ss zzz") spark = SparkSession.builder.config(conf=sparkConf).getOrCreate() data_csv="abfs://test-file-system@myaccount.dfs.core.windows.net/data.csv" data_out = "abfs://test-file-system@myaccount.dfs.core.windows.net/data_out.csv" # 注意原代码此处的self.spark_session为错误写法,直接用定义的spark变量即可 df = spark.read.csv(data_csv) # write csv df.write.csv(data_out)
方法3:屏蔽非必要错误日志
如果业务已经正常运行,只是不想看到多余的报错日志,可以调整日志配置,将org.apache.hadoop.fs.azurebfs.AzureBlobFileSystemStore包的日志级别调整为WARN以上,即可屏蔽该不影响业务的错误输出。
内容的提问来源于stack exchange,提问作者vll1990
相关产品推荐
相关产品推荐

