AWS中的EMR 5.20上的Spark 2.4上遇到了问题。
我有一个字符串列作为分区,该分区具有日期值。我的目标是将此列的最大值称为过滤器。这些值看起来像2019年1月1日的2019-01-01
。
在此查询中,我试图过滤到特定日期值(这是字符串数据类型),而Spark最终会读取所有目录,而不仅仅是所得的max(value)
。
spark.sql("select mypartitioncolumn, column1, column2 from mydatabase.mytable where mypartitioncolumn= (select max(mypartitioncolumn) from myothertable) group by 1,2,3 ").show
但是,在这种情况下,如果我进行了编码值,它将仅读取适当的目录。
spark.sql("select mypartitioncolumn, column1, column2 from mydatabase.mytable where mypartitioncolumn= '2019-01-01' group by 1,2,3 ").show
为什么Spark不以相同的方式识别这两种方法?我确保如果运行select max(mypartitioncolumn) from myothertable
查询,它显示与我的硬编码方法完全相同的值(以及相同的数据类型)。
我在文档中找不到任何区分数据类型差异以外的分区查询的任何内容。我检查了以确保源表中的架构以及值是字符串类型,并且还试图将我的值作为字符串以及cast( (select max(mypartitioncolumn) from myothertable) as string)
施放,这没有任何区别。
通过更改配置
解决方法sql("set spark.sql.hive.convertMetastoreParquet = false")
Spark Docs
"从阅读和写作到Hive Metastore Parquet表中,Spark SQL将尝试使用自己的木木quet支持而不是Hive Serde来获得更好的性能。此行为由Spark.sql.hive.hive.convertmetastoreparquet配置控制,并且IS IS是默认打开。"