默认情况下,MaxCompute会禁用笛卡尔积,因此当两个表进行JOIN的时候,如果没有指定JOIN的条件,则会退化为两个表之间进行笛卡尔积计算,导致出现ODPS-0130252错误。
对此,笔者总结了下述三种解决方案。
1.当其中JOIN的一张表是小表时,我们可以设置SET odps.sql.allow.cartesian = TRUE;
2.此外,我们还可以使用MAPJOIN,在MAP阶段将指定表的数据全部加载在内存中。例子如下所示:
SELECT /*+ MAPJOIN(tmp_1) */
a
,b
FROM (
SELECT a
FROM table_a
) AS tmp_1
JOIN (
SELECT b
FROM table_b
) AS tmp_2
;
3.当JOIN的表都是大表时,使用上述方案会发生数据膨胀。因此,我们可以往SELECT中增加字段来解决问题。例子如下:
SELECT a
,b
FROM (
SELECT a
,'1' AS tmp_field
FROM table_a
) AS tmp_1
JOIN (
SELECT b
,'1' AS tmp_field
FROM table_b
) AS tmp_2
ON tmp_1.tmp_field = tmp_2.tmp_field
;