gpt4 book ai didi

scala - 从 Spark 读取 Hive 表作为数据集

转载 作者:行者123 更新时间:2023-12-04 13:22:08 25 4
gpt4 key购买 nike

我正在尝试将 spark 中的配置单元表作为强类型 Dataset 读取,并且我注意到分区没有被修剪,而不是在同一个数据帧上执行 Spark SQL hive 表。

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

states 按国家/地区分区,因此当我对上述数据集进行计数时,查询会扫描所有分区。但是,如果我这样阅读它 -

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 必须应用复杂且不可靠的静态分析,像这样的功能既不存在,也没有(据我所知)计划在未来使用。

第二种情况不应该编译(没有接受字符串的 groupByKey 变体),所以无法判断,但一般来说它也不应该修剪,除非你的意思是:

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

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

关于scala - 从 Spark 读取 Hive 表作为数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49740497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com