在 Hive 日志输出的最顶部,它指出“警告:阶段 'Stage-1 Mapred' 中的 Shuffle Join JOIN[4][Tables a, b] 是叉积。”
编辑:
“叉积”或笛卡尔积是无条件的联接,它针对“a”表中的每一行返回“b”表中的每一行。因此,如果您以“a”为 5 行、“b”为 10 行为例,您将得到乘积,即 5 乘以 10 = 返回 50 行。对于一个或其他表来说,会有很多行完全为“空”。
现在,如果您有一个包含 20,000 行的表“a”,并将其连接到另一个包含 500,000 行的表“b”,那么您要求 SQL 引擎返回一个包含 10,000,000,000 行的数据集“a, b”,然后对 1000 万行执行 BETWEEN 操作。
因此,如果您删除“b”行的数量,您会发现您将获得比“a”更多的好处 - 在您的示例中,如果您可以过滤 ip_logs 表(表 2),因为我猜测它有比您的订单号表更多的行,它将减少执行时间。
结束编辑
您通过不指定连接条件来强制执行引擎处理笛卡尔积。它必须一遍又一遍地扫描表a的所有内容。如果有 10 行,就不会有问题。有了 20k,您就会遇到数十次 Map/Reduce 波。
尝试这个查询:
SELECT b.itemcode
FROM foo a JOIN bar b on <SomeKey>
WHERE a.orderno BETWEEN b.startorderno AND b.endorderno;
但我无法确定您的模型将允许加入哪个列。也许这个表达式的数据模型可以改进?可能只是我没有清楚地阅读示例。
无论哪种方式,您都需要在 where 子句之前过滤比较次数。我在 Hive 中完成此操作的其他方法是使用较小的数据集创建视图,并连接/匹配视图而不是原始表。