2017-08-21 10 views
0

J'ai un jeu de données en parquet dans S3 partitionné par date (dt) avec la date la plus ancienne stockée dans AWS Glacier pour économiser de l'argent. Par exemple, nous avons ...étincelle lire les données partitionnées dans S3 en partie dans le 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] 

Je veux lire cet ensemble de données, mais seulement un sous-ensemble de date qui ne sont pas encore dans le glacier, par exemple:

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)) 

Malheureusement, je la exception

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) 

Je semble que cette étincelle n'aime pas le jeu de données partitionné lorsque certaines partitions sont dans Glacier. Je pourrais toujours lire spécifiquement chaque date, ajouter la colonne avec la date actuelle et reduce(_ union _) à la fin, mais il est moche comme l'enfer et il ne devrait pas être nécessaire.

Existe-t-il une astuce pour lire les données disponibles dans le magasin de données même avec des données anciennes dans glacier?

+0

Je ne crois pas que ce soit possible. AWS Glacier ne semble pas prendre en charge les prédicats pushdown ... – eliasah

+1

N'utilisez pas glacier si vous avez besoin de récupérer des données récentes. Cela n'en vaut pas la peine, et vous pourriez entrer dans un piège de prix. Juste stocker vos données et standard-IA. https://medium.com/@karppinen/how-i-ended-up-paying-150-for-a-single-60gb-download-from-amazon-glacier-6cb77b288c3e – mootmoot

+0

Salut moquant. Je ne veux pas débloquer les données dans Glacier (ce qui serait prohibitif). Mon point était que je veux utiliser des partitions de mon ensemble de données qui ne sont pas encore dans le glacier, mais d'autres partitions (que je ne veux pas lire) sont! Je pense que la seule façon est de modifier le SDK AWS, afin qu'il n'essaie pas d'analyser les partitions gelées du tout. – Boris

Répondre

0

Les connecteurs S3 d'Amazon (s3: //) et de l'ASF (s3a: //) ne fonctionnent pas avec Glacier. Certainement personne ne teste s3a contre glacier. et s'il y avait des problèmes, il vous resterait à les réparer vous-même. Il suffit de copier les données dans s3 ou sur HDFS local, puis de les utiliser

0

Si vous définissez votre table via Hive et utilisez le catalogue métastore Hive pour l'interroger, il ne tentera pas d'accéder aux partitions non sélectionnées . Jetez un coup d'œil au paramètre spark.sql.hive.metastorePartitionPruning