从spark读取hive表作为数据集

avkwfej4  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(577)

我试图把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类时会丢失分区信息吗?

fdx2calv

fdx2calv1#

热释光;dr缺少分区修剪在第一种情况下是预期的行为。
发生这种情况的原因是对对象的任何操作都不同于 DataFrame 从优化器的Angular 来看,dsl/sql是一个黑盒。能够优化功能,如 x=> x._1 == "US" 或者 x => x.country spark将不得不应用复杂且不可靠的静态分析,这样的功能既不存在,也不(据我所知)计划在未来使用。
第二种情况不应该编译(没有 groupByKey 变量,所以不可能分辨,但通常也不应该删减,除非您的意思是:

hiveDF.groupBy($"country").count().filter($"country" =!= "US")

另请参阅我对spark 2.0 dataset vs dataframe的回答。

相关问题