我试图把spark中的一个Hive表看作强类型的 Dataset
,我注意到分区没有被修剪,而不是对来自同一个配置单元表的Dataframe执行sparksql。
case class States(state: String, country: String)
val hiveDS = spark.table("db1.states").as[States]
//no partition pruning
hiveDS.groupByKey(x=>x.country).count().filter(x=>x._1 == "US")
州是按国家划分的,所以当我对上面的数据集进行计数时,查询会扫描所有的分区。但是如果我这样读的话-
val hiveDF = spark.table("db1.states")
//correct partition pruning
hiveDF.groupByKey("country").count().filter(x=>x._1 == "US")
分区已正确修剪。有人能解释为什么在将表Map到case类时会丢失分区信息吗?
1条答案
按热度按时间fdx2calv1#
热释光;dr缺少分区修剪在第一种情况下是预期的行为。
发生这种情况的原因是对对象的任何操作都不同于
DataFrame
从优化器的Angular 来看,dsl/sql是一个黑盒。能够优化功能,如x=> x._1 == "US"
或者x => x.country
spark将不得不应用复杂且不可靠的静态分析,这样的功能既不存在,也不(据我所知)计划在未来使用。第二种情况不应该编译(没有
groupByKey
变量,所以不可能分辨,但通常也不应该删减,除非您的意思是:另请参阅我对spark 2.0 dataset vs dataframe的回答。