apache-spark - 如何“强制”Spark 上的 Hive 使用 Map Join?
问题描述
Spark 上的 Hive 不使用 Map-Join 来查询对多个表执行联合的视图。
当使用 MR 引擎进行相同的查询时,使用 Map-Join。
我尝试按照 Cloudera 的建议设置各种火花设置 - https://www.cloudera.com/documentation/enterprise/5-13-x/topics/admin_hos_oview.html#dpp_in_hos
我正在使用的视图是一个简单的联合,遍布一些具有相同结构并已分区的表。
视图是这样创建的:
create view myView
as
select * from tbl1
union all
select * from tbl2
union all
select * from tbl3
union all
select * from tbl4
我正在运行的 HQL 查询有一个“ where子句”,其中需要进行分区访问。HoS 没有意识到这一点,而 HoMR 利用了分区和 Map-Join。
当前使用 Hive 1.1(建议升级与 atm 无关)
谢谢
解决方案
如本 Cloudera 文档MapJoin
中所述,以下设置对Hive On Spark中的行为有直接影响:
...
hive.auto.convert.join.noconditionaltask.size
,这是将 common join 转换为基于统计的 map join 的阈值,可能会对性能产生重大影响。尽管此配置用于 MapReduce 上的 Hive 和 Spark 上的 Hive,但它们的解释不同。数据的大小由两个统计数据描述:
totalSize
- 磁盘上数据的近似大小rawDataSize
- 内存中数据的近似大小MapReduce 上的 Hive 使用
totalSize
. 当两者都可用时,Hive on Spark 使用rawDataSize
. 由于压缩和序列化,同一数据集之间可能会出现totalSize
很大差异。rawDataSize
对于 Spark 上的 Hive,您可能需要为 指定更大的值hive.auto.convert.join.noconditionaltask.size
才能将相同的连接转换为映射连接。
请查看这是否适用于您的情况。
由于我们没有看到您的查询,我不确定动态分区修剪(在您的链接中引用)与您的MapJoin
问题有何关系。
推荐阅读
- rcpparmadillo - 使用 Rcpp 对矩阵 A 及其在 R 中的转置进行快速矩阵乘法
- google-api - 需要帮助了解 GMeet 集成以构建 AI 功能
- laravel - 嵌套组件 Livewire
- sql-server - SQL将多个表合并为一个问题
- node.js - 如何在 shelljs 中执行正确的“sed”命令?
- api - YouTube 数据 API:视频的标题不在 commentThreads 端点结果中
- java - 我如何按特定顺序序列化 java 对象
- python - 有没有办法删除DataFrame中一维数组中的空值?
- c - c中的组位
- python - 如何使用 GET 方法在 selenium 中打开 url