sparksql分区感知查询配置单元表

jhkqcmku  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(417)

给定由某个\字段(int类型)分区的hive表,其中数据存储为avro文件,我想使用sparksql查询表,这样返回的Dataframe必须已经由某个\字段(用于分区)分区。
查询看起来就像

SELECT * FROM some_table

默认情况下,spark不会这样做,返回的数据\u frame.rdd.partitioner是none。
获得结果的一种方法是在查询后通过显式重新分区,但可能有更好的解决方案。
HDP2.6,Spark2。
谢谢。

bxgwgixi

bxgwgixi1#

首先,您必须区分 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)

然而,这不太可能对您有所帮助,因为到今天(spark2.2),数据源api还不知道物理存储信息(除了简单的分区修剪)。在即将到来的数据源api中,这应该会改变。详见jira票(spark-15689)及设计文件。

相关问题