给定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。
感谢。
答案 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。