给定按 some_field(int 类型)Hive 表分区,数据存储为 Avro 文件,我想使用 Spark SQL 查询表,返回的数据帧必须已经按 some_field(用于分区)分区。
查询看起来像
SELECT * FROM some_table
默认情况下 Spark 不会这样做,返回的 data_frame.rdd.partitioner 是 None。
获得结果的一种方法是在查询后通过显式重新分区,但可能有更好的解决方案。
HDP 2.6、Spark 2。
谢谢。
最佳答案
首先,您必须区分 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了解详情。
关于hadoop - Spark SQL分区感知查询配置单元表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47184481/