【发布时间】:2018-02-25 21:26:19
【问题描述】:
如果需要的块在同一个节点上(位于同一节点),我的目标是防止节点之间不必要的数据交换。
我有两个表,A 和 B(简化示例):
Table A Table B
ID ID
0 0
0 0
0 1
1
1
表 A 由两个 parquet 文件组成,导致两个块:
Block1 Block2
ID ID
0 1
0 1
0
B 表也一样:
Block1 Block2
ID ID
0 1
0
假设我有两个节点 N1、N2。 TableA-Block1 和 TableB-Block1 在 N1 上,TableA-Block2 和 TableB-Block2 在 N2 上。
如果我有类似的查询
Select * from TableA INNER JOIN TableB on TableA.Id=TableB.Id
Impala 将在两个节点之间交换数据。它看起来类似于这个例子:
如果块在集群中随机分布,则计划看起来相同,因此 Impala 不会利用“本地”块。
我希望 Impala 在 TableA-Block1 和 TableB-Block1 以及 TableA-Block2 和 TableB-Block2 之间进行本地连接,以防止网络流量。我怎么能在 Impala 中做到这一点?
【问题讨论】: