如何读取S3嵌套分区Parquet文件并将分区列加载至DataFrame schema
Spark读取S3分区Parquet保留分区列及本地Windows报错解决方案
读取分区文件保留分区列的正确方法
你当前使用的三种读取方式都无法生成分区列,原因如下:
- 方式1、3使用通配符直接匹配子目录下的parquet文件,Spark无法识别上层
exposure_date=xxx格式的分区目录结构,不会自动推断分区列 - 方式2主动开启了
recursiveFileLookup参数,该参数会禁用Spark的自动分区发现功能,自然也不会生成分区列
只需要直接读取分区根目录即可,Spark会自动识别Hive风格的键=值分区目录,将exposure_date作为分区列加入DataFrame的schema:
# S3环境读取 df = spark.read.parquet("s3://alex/covid/") # 本地环境读取 df = spark.read.parquet("C:/Users/mthma/covid_contact_mock_data.parquet/")
读取后可以用df.printSchema()验证,确认exposure_date列已经存在。
本地Windows环境NativeIO报错解决方案
报错是Windows环境运行Spark的常见问题,缺少Hadoop的Windows适配二进制文件(winutils相关组件),解决方法如下:
- 下载和你Spark依赖的Hadoop版本匹配的winutils压缩包
- 解压后将
bin目录下的所有文件,复制到本地JDK的bin目录,同时如果配置了HADOOP_HOME环境变量,也同步复制到HADOOP_HOME对应的bin目录 - 新增系统环境变量
HADOOP_HOME,值为你解压的hadoop目录路径,再将%HADOOP_HOME%\bin添加到系统Path变量中 - 重启IDE或命令行窗口后重新运行代码即可
如果需要临时规避该问题,可以在代码初始化SparkSession后添加如下配置:
spark.conf.set("spark.hadoop.fs.file.impl", "org.apache.hadoop.fs.RawLocalFileSystem")
内容的提问来源于stack exchange,提问作者Mari Muthu
相关产品推荐
相关产品推荐

