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

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

给定按 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/

相关文章:

hadoop - 将数据写入 Hadoop

hadoop - 在 hadoop 中合并小文件 - 有哪些不同的方法?

apache-spark - Spark SQL 如何读取 Parquet 分区文件

regex - 必须通过正则表达式提取去除最后一次出现的符号 ^ 字符来提取单词的开头以结束

java - 为什么 Hive 和 HiveServer2 需要 mapred.InputFormat?

sql - Hive:日期范围未从表中获取数据

hadoop - HBase 表大小在一段时间后减少

hadoop - Sentry 的 Hive 用户模拟

java - 在 Hadoop 中的 Reducer 中收集多个映射器的结果

apache-spark - Hive 数据库仅列出默认数据库