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