当前位置: 首页 > 知识库问答 >
问题:

从Spark中读取配置单元表作为数据集

百里泓
2023-03-14
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类时会丢失分区信息吗?

共有1个答案

容鸿畴
2023-03-14

在第一种情况下缺少分区剪枝是预期的行为。

发生这种情况是因为从优化器的角度来看,与dataframeDSL/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语句。