Hive 内部表和 SparkSql 中的分桶

Posted

技术标签:

【中文标题】Hive 内部表和 SparkSql 中的分桶【英文标题】:Bucketing in Hive Internal Table and SparkSql 【发布时间】:2019-03-16 00:35:02 【问题描述】:

我通过数据帧编写器 saveAsTable api 创建了一个分桶的内部配置单元表。

df.repartition(numBuckets, somecol)
              .write()
              .format("parquet")
              .bucketBy(numBuckets,col1)
              .sortBy(col1)
              .saveAsTable(hiveTableName);

现在我通过 spark sql 触发 2 个选择查询,一个在分桶列上,另一个在非分桶列上,但我看不出执行时间有任何差异。

查询是: select * from t1 where col1='123' [t1 is bucketed by col1] select * from t1 where col2='123' [col2 不是分桶列] 我的问题是

    如何确定在查询执行期间发生了全表扫描或相关的部分表扫描?

    我可以从 DAG 或物理计划中获得任何信息吗?两个我都看过,但我看不出有什么区别 这是我在物理计划中看到的

    == 物理计划 == *(1) 项目 [col1#0, col2#1, col3#2, col4#3, col5#4, col6#5, col7#6, col8#7, col9#8, col10#9, col11#10, col12#11] +- *(1) 过滤器 (isnotnull(col2#1) && (col2#1 = 123)) +- *(1) FileScan parquet default.uk_geocrosswalk[col1#0,col2#1,col3#2,col4#3,col5#4,col6#5,col7#6,col8#7,col9#8,LSOA_MSOA_WEIGHT# 9,col11#10,col12#11] 批处理:true,格式:Parquet,位置:InMemoryFileIndex[hdfs://url/a.parquet,PartitionFilters:[],PushedFilters:[IsNotNull(col2),EqualTo(col2,123) )], ReadSchema: 结构

    在物理计划中为什么要进行文件扫描?由于表已创建为配置单元表,因此不应该执行 HiveTableScan 吗?

    在使用 sparksql 时是否可以使用某些配置参数来调整查询? 我看到每次我在 spark sql 中第一次运行查询都需要相当长的时间。有没有办法在执行查询之前预热执行程序?

【问题讨论】:

【参考方案1】:

镶木地板是柱状的。根据我的经验,镶木地板非常快。柱状方面可以很好地解释相同的性能 - 无论是否键,数据格式在物理上都是柱状的。

这是一个 Hive 表,但使用 Parquet 和 Bucketing,Hive / Impala 无法访问。由于是 Parquet,Hive Table Scan 不合适。 Hive 表可以有多种物理格式,文本、Parquet、ORC。

可以看到过滤:PartitionFilters: [], PushedFilters: [IsNotNull(col2), EqualTo(col2,123)],

没有这样的热身。你可以 .cache 东西,但我已经测试并看到了在缓存 Parquet 表方面没有太大差异的测试,但这取决于测试。

【讨论】:

但是为什么 partitionFilter 是空白的?我已经存储了通过列聚集的数据 也许有错误,但对我来说很有意义。一些输出不是那么容易解释

以上是关于Hive 内部表和 SparkSql 中的分桶的主要内容,如果未能解决你的问题,请参考以下文章

Hive常用命令

Hive的分桶

通过 sparkSQL 进行 Hive 分桶

Hive中的分桶

Hive的分区表与分桶表&内部表外部表

2min快速了解,Hive内部表和外部表