Spark SQL分区感知查询Hive表

3

假设有一张按 int 类型字段 some_field 分区的 Hive 表,其中数据以 Avro 文件形式存储。我想使用 Spark SQL 查询该表,并确保返回的 Data Frame 已经按 some_field(用于分区)进行了分区。

查询语句如下:

SELECT * FROM some_table

默认情况下,Spark不会这样做,返回的data_frame.rdd.partitioner为None。

一种获得结果的方法是在查询后进行显式的重分区,但可能有更好的解决方案。

HDP 2.6,Spark 2。

谢谢。


1
我认为你所说的是两个不同的事情,分别是Hive分区和数据集分区,它们完全独立。请点击链接了解RDD/数据集分区的相关信息。 - Rahul Sharma
当然,它们是独立的,但是直到执行引擎无法利用底层存储分区时,后者才是无用的。感谢提供链接。 - Valentin P.
1个回答

4

首先,您需要区分 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票证(SPARK-15689)设计文档


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接