Spark SQL分区感知查询hive表
Posted
技术标签:
【中文标题】Spark SQL分区感知查询hive表【英文标题】:Spark SQL partition awareness querying hive table 【发布时间】:2017-11-08 16:11:32 【问题描述】:鉴于由 some_field(int 类型)分区的 Hive 表以及存储为 Avro 文件的数据,我想使用 Spark SQL 以返回的数据帧必须已经由 some_field(用于分区)分区的方式查询表。
查询看起来就像
SELECT * FROM some_table
默认情况下,Spark 不这样做,返回的 data_frame.rdd.partitioner 为 None。
获得结果的一种方法是在查询后通过显式重新分区,但可能有更好的解决方案。
HDP 2.6、Spark 2。
谢谢。
【问题讨论】:
我认为您在谈论 2 个不同的事情,配置单元分区和数据集分区,两者都是完全独立的。关注 line 了解 rdd/dataset 分区。 当然它们是独立的,但是在执行引擎不能利用底层存储分区之前,后者是没有用的。感谢您的链接。 【参考方案1】:首先,您必须区分Dataset
的分区和转换后的RDD[Row]
的分区。不管前者的执行计划是什么,后者都不会有Partitioner
:
scala> val df = spark.range(100).repartition(10, $"id")
df: org.apache.spark.sql.Dataset[Long] = [id: bigint]
scala> df.rdd.partitioner
res1: Option[org.apache.spark.Partitioner] = None
但是内部RDD
,可能有Partitioner
:
scala> df.queryExecution.toRdd.partitioner
res2: Option[org.apache.spark.Partitioner] = Some(org.apache.spark.sql.execution.CoalescedPartitioner@5a05e0f3)
但这不太可能对您有所帮助,因为截至今天(Spark 2.2),数据源 API 不知道物理存储信息(除了简单的分区修剪)。这应该在即将到来的数据源 API 中改变。详情请参考JIRA ticket (SPARK-15689)和design document。
【讨论】:
以上是关于Spark SQL分区感知查询hive表的主要内容,如果未能解决你的问题,请参考以下文章
Spark SQL(通过 HiveContext 进行 Hive 查询)总是创建 31 个分区
Spark SQL写入Hive,同分区overwrite,不同分区insert