【发布时间】:2019-05-15 22:05:27
【问题描述】:
我有一个如下形式的文件结构
s3://<bucket>/year=2018/month=11/day=26/hour=10/department=x/part-xxxxx.gz.parquet
我的 AWS 凭证无法访问所有 department= 值,只有少数。
我正在尝试执行
df = spark.read.parquet("s3://<bucket>/year=2018/")
这失败了
java.io.IOException: Could not read footer: java.io.IOException: Could not read footer for file FileStatus{path=s3://<bucket>/year=2018/month=11/day=26/hour=10/department=yyyyyy/part-xxxxx.gz.parquet; isDirectory=false; length=104448; replication=0; blocksize=0; modification_time=0; access_time=0; owner=; group=; permission=rw-rw-rw-; isSymlink=false}
显然失败了,因为我只能访问department=x 而不能访问department=yyyy,我的问题是:有没有办法默默地忽略这些?
我目前的解决方法是像这样构造仅有效路径:
tmpl = 's3://<bucket>/year=2018/month=11/day=26/hour={hour}/department=x/'
df = spark.read.parquet(*list(tmpl.format(hour=hour) for hour in range(1,24)))
这很麻烦因为
- 某些路径可能不存在(缺少数据数小时等)。
-
spark.read.parquet不接受列表或生成器作为输入,因此我不得不使用 splat/unpack 运算符将所有内容转换为单独的参数。不确定这是否适用于数千条路径。
有没有更好的方法来加载这些数据而不改变文件结构(我无法控制)?
【问题讨论】:
标签: apache-spark pyspark apache-spark-sql