背景
同一个SQL在hive里执行正常,但是用sparksql执行异常,抛出如下错误:
the operation is not valid for the object's storage class glacier
原因在于,这个表是分区表,且设置了S3的存储自动生命周期,所以超过N天之前的数据就变成了glacier,无法直接用于检索。但是很好奇的是对于同样的hive语句是可以执行的,所以问题出在spark-sql,通过分析执行日志,发现spark-sql在执行where条件过滤的时候扫描了所有分区,因此会触发对glacer存储的读操作,stack overflow上有类似的提问:https://stackoverflow.com/questions/45798074/spark-read-partitioned-data-in-s3-partly-in-glacier
方案
在spark-defaults.conf里增加配置spark.sql.hive.caseSensitiveInferenceMode NEVER_INFER或者执行ss.sql("set spark.sql.hive.caseSensitiveInferenceMode=NEVER_INFER")
参考
类似的问题还会存在于 refresh table 的操作
https://blog.csdn.net/weixin_39031707/article/details/105740003