ODPS-0130252

本文为您介绍错误码ODPS-0130252:Cartesian product is not allowed的报错场景,并提供对应的解决方案。

错误:cartesian product is not allowed without mapjoin

错误信息示例

ODPS-0130252:[m,n] Cartesian product is not allowed - cartesian product is not allowed without mapjoin

问题描述

两个表进行JOIN的时候,如果没有指定JOIN的条件,则会退化为两个表之间进行笛卡尔积计算。在odps.sql.allow.cartesian取值为false的时候,会报上述错误。

解决方案

建议的方案是修改Query:

  • 当其中JOIN的一张表是小表时,可以设置odps.sql.allow.cartesian值为true或者补充JOIN的关联条件来解决。

  • 当JOIN的表都是大表时,不推荐odps.sql.allow.cartesian设置为true,会发生数据膨胀。建议补充JOIN的关联条件来解决。

Query示例

--错误,当前的设置是不允许笛卡尔积
odps> SET odps.sql.allow.cartesian=false;
odps> SELECT t1. *
FROM src t1
JOIN src t2;

FAILED: ODPS-0130252:[3,1] Cartesian product is not allowed - cartesian product is not allowed without mapjoin

--正确,补充join条件,这里join条件是两个表的字段相等
odps> SELECT t1. *
FROM src t1
JOIN src t2
ON t1.key = t2.key;

--正确,补充join条件,由于join条件不是字段取值相等,因此需要指定mapjoin hint
odps> SELECT /*+mapjoin(t1) * / t1.*
FROM src t1
JOIN src t2
ON t1.key > t2.key;