繁体   English   中英

从Spark读取Hive表作为数据集

[英]Reading Hive table from Spark as a Dataset

我正在尝试将spark中的配置单元表读取为强类型的Dataset ,并且我注意到与在同一个配置单元表中的数据帧上执行Spark SQL相比,未修剪分区。

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")

分区已正确修剪。 谁能解释将表映射到案例类时分区信息丢失的原因?

TL; DR在第一种情况下缺少分区修剪是预期的行为。

之所以发生这种情况,是因为从优化程序的角度来看,与对DataFrame DSL / SQL使用的操作不同,对对象进行的任何操作都是黑匣子。 为了能够优化x=> x._1 == "US"x => x.country Spark必须应用复杂x => x.country可靠的静态分析,并且这种功能既不存在,也(据我所知) )为未来计划。

第二种情况不应该编译(不存在带字符串的groupByKey变体),因此无法分辨,但通常也不应groupByKey ,除非您的意思是:

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

另请参阅我对Spark 2.0 Dataset vs DataFrame的回答

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM