Spark SQL分区感知查询配置单元表

时间:2017-11-08 16:11:33

标签: hadoop apache-spark hive apache-spark-sql partitioning

给定some_field(int类型)Hive表分区,数据存储为Avro文件,我希望使用Spark SQL查询表,返回的数据帧必须已经被some_field分区(用于分区)。 / p>

查询看起来只是

SELECT * FROM some_table

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

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

HDP 2.6,Spark 2。

感谢。

1 个答案:

答案 0 :(得分: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),Data Source API并不知道物理存储信息(除了简单的分区修剪)。这应该会在即将推出的Data Source API中发生变化。有关详细信息,请参阅JIRA ticket (SPARK-15689)design document