У меня есть набор данных в паркете в S3, разделенный по дате (dt), причем самая старая дата хранится в AWS Glacier, чтобы сэкономить деньги. Например, у нас...
s3://my-bucket/my-dataset/dt=2017-07-01/ [in glacier]
...
s3://my-bucket/my-dataset/dt=2017-07-09/ [in glacier]
s3://my-bucket/my-dataset/dt=2017-07-10/ [not in glacier]
...
s3://my-bucket/my-dataset/dt=2017-07-24/ [not in glacier]
Я хочу прочитать этот набор данных, но только подмножество дат, которые еще не находятся в леднике, например:
val from = "2017-07-15"
val to = "2017-08-24"
val path = "s3://my-bucket/my-dataset/"
val X = spark.read.parquet(path).where(col("dt").between(from, to))
К сожалению, у меня есть исключение
java.io.IOException: com.amazon.ws.emr.hadoop.fs.shaded.com.amazonaws.services.s3.model.AmazonS3Exception: The operation is not valid for the object's storage class (Service: Amazon S3; Status Code: 403; Error Code: InvalidObjectState; Request ID: C444D508B6042138)
Мне кажется, что spark не нравится секционированный набор данных, когда некоторые разделы находятся в Glacier. Я всегда мог прочитать конкретно каждую дату, добавить столбец с текущей датой и reduce(_ union _)
в конце, но это чертовски уродливо, и в этом нет необходимости.
Есть ли какой-нибудь совет для чтения доступных данных в хранилище данных даже со старыми данными в glacier?