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

Spark 不使用 Hive 分区外部表中的分区信息

如何使用 Spark SQL 识别 hive 表中的分区列

Spark Sql 从 Hive orc 分区表中读取,给出数组越界异常

源码级解读如何解决Spark-sql读取hive分区表执行效率低问题