首页 > 解决方案 > 使用 S3 中的嵌套分区文件创建数据框,并在架构中加载具有分区列名称的数据框

问题描述

嵌套 S3 分区文件如下:

s3://alex/covid/exposure_date=**2021-02-01**/aec600b87b9a467d9395d2f5c0e2eeaa.parquet
s3://alex/covid/exposure_date=**2020-05-01**/dec600b87b9a467d9395d2f5c0e2eeaa.parquet
s3://alex/covid/exposure_date=**2021-06-01**/efe600b87b9a467d9395d2f5c0e2eeaa.parquet
s3://alex/covid/exposure_date=**2021-08-01**/acd600b87b9a467d9395d2f5c0e2eeaa.parquet

尝试了不同的阅读方式:

方式一:

df = spark.read.parquet("s3:/alex/covid/**/*.parquet")

方式二:

df=spark.read.option("recursiveFileLookup","true").parquet("s3:/alex/covid/covid_contact_mock_data.parquet/")

方式3:

df = spark.read.parquet("s3://alex/covid//**/*.parquet")

我期待分区列也是数据框列之一

在本地尝试做但得到错误

df = spark.read.parquet("C:/Users/mthma/covid_contact_mock_data.parquet/exposure_date=2020-12-03/*")

错误:

Exception in thread "globPath-ForkJoinPool-6-worker-115" java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Ljava/lang/String;I)Z
        at org.apache.hadoop.io.nativeio.NativeIO$Windows.access0(Native Method)
        at org.apache.hadoop.io.nativeio.NativeIO$Windows.access(NativeIO.java:793)
        at org.apache.hadoop.fs.FileUtil.canRead(FileUtil.java:1215)
        at org.apache.hadoop.fs.FileUtil.list(FileUtil.java:1420)
        at org.apache.hadoop.fs.RawLocalFileSystem.listStatus(RawLocalFileSystem.java:601)
        at org.apache.hadoop.fs.FileSystem.listStatus(FileSystem.java:1972)

标签: pythonapache-sparkamazon-s3pysparkapache-spark-sql

解决方案


您在使用通配符时遇到问题。

至少在本地情况下,您可以使用以下命令将它们扩展为单个文件名:

folder = "C:/Users/mthma/covid_contact_mock_data.parquet/exposure_date=2020-12-03"
for file in glob.glob(f'{folder}/*'):
    df = spark.read.parquet(file)
    print(df.head())

https://docs.python.org/3/library/glob.html#glob.glob

S3 不同。您应该使用该boto3库来查询 S3 以获取各个路径名。


推荐阅读