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")
分区被正确修剪。有人能解释为什么当您将表映射到case类时会丢失分区信息吗?
在第一种情况下缺少分区剪枝是预期的行为。
发生这种情况是因为从优化器的角度来看,与dataframe
DSL/SQL使用的操作不同,对对象的任何操作都是一个黑盒。为了优化诸如x=>x._1==“美国”
或x=>x.country
之类的函数,Spark必须应用复杂且不可靠的静态分析,而这样的功能既不是现在的,也不是(据我所知)将来的计划。
第二种情况不应该编译(没有groupbykey
变量接受字符串),所以不可能区分,但通常它也不应该剪枝,除非您的意思是:
hiveDF.groupBy($"country").count().filter($"country" =!= "US")
我正在使用Spark SQL读取一个配置单元表,并将其分配给一个scala val 有什么方法可以绕过这个错误吗?我需要将记录插入到同一个表中。 嗨,我试着按建议做,但仍然得到同样的错误。
我对spark数据帧的分区数量有疑问。 如果我有包含列(姓名、年龄、id、位置)的Hive表(雇员)。 如果雇员表有10个不同的位置。因此,在HDFS中将数据划分为10个分区。 如果我通过读取 Hive 表(员工)的整个数据来创建 Spark 数据帧(df)。 Spark 将为数据帧 (df) 创建多少个分区? df.rdd.partitions.size = ??
我试图在配置单元中执行select*from db.abc操作,此配置单元表是使用spark加载的 “它不工作”显示错误: 错误:java.io.IOException:java.lang.IllegalArgumentException:bucketId超出范围:-1(状态=,代码=0) 我需要在spark-submit或shell中添加任何属性吗?或者使用spark读取此hiv e表的另一种方
我在Hive(beeline)中创建了一个表,下面的命令是: 我还有一个小的自定义文件,其中包含示例记录,如: 有什么想法吗?
编辑:使用工作,不知道它是如何工作的
我有一个文件名、FilePath和FileSize的列表,我想使用spark SQL将这些细节插入到我的配置单元表中。 是否有任何方法可以再次将此查询拆分为3个不同的insert hive语句。