У меня есть файловая структура в следующей форме
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, чтобы преобразовать все в отдельные аргументы.Не уверен, что это работает нормально с тысячами путей.
Есть ли лучший способ загрузить эти данные без изменения файловой структуры (которую я не контролирую)?