Spark SQL忽略动态分区过滤器值

时间:2019-02-20 21:14:32

标签: apache-spark apache-spark-sql

在AWS的EMR 5.20上的Spark 2.4上遇到问题。

我有一个字符串列作为分区,其中有日期值。我的目标是将此列的最大值作为过滤器引用。这些值看起来像是2019-01-01(2019年1月1日)。

在此查询中,我尝试过滤到某个日期值(这是字符串数据类型),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),这没有任何区别。

1 个答案:

答案 0 :(得分:0)

更改配置的解决方法

sql("set spark.sql.hive.convertMetastoreParquet = false")

火花文档

“在读取和写入Hive metastore Parquet表时,Spark SQL将尝试使用其自己的Parquet支持而不是Hive SerDe,以获得更好的性能。此行为由spark.sql.hive.convertMetastoreParquet配置控制,并且默认情况下处于打开状态。”