当前位置: 首页 > 知识库问答 >
问题:

检测到逻辑计划之间的内部连接的隐式笛卡尔积

云镜
2023-03-14

我正在尝试加入两个数据集

+-------------+-----------------+-----------+
|  countryName|countryPopulation|countrySize|
+-------------+-----------------+-----------+
|        China|       1210004992|    9596960|
|        India|        952107712|    3287590|
| UnitedStates|        266476272|    9372610|
|    Indonesia|        206611600|    1919440|
|       Brazil|        162661216|    8511965|
|       Russia|        148178480|   17075200|
|     Pakistan|        129275664|     803940|
|        Japan|        125449704|     377835|
|   Bangladesh|        123062800|     144000|
|      Nigeria|        103912488|     923770|
|       Mexico|         95772464|    1972550|
|      Germany|         83536112|     356910|
|  Philippines|         74480848|     300000|
|      Vietnam|         73976976|     329560|
|         Iran|         66094264|    1648000|
|        Egypt|         63575108|    1001450|
|       Turkey|         62484480|     780580|
|     Thailand|         58851356|     514000|
|UnitedKingdom|         58489976|     244820|
|       France|         58317448|     547030|
+-------------+-----------------+-----------+

DS2:

+------------+-----------------+-----------+
| countryName|countryPopulation|countrySize|
+------------+-----------------+-----------+
|       China|       1210004992|    9596960|
|       India|        952107712|    3287590|
|UnitedStates|        266476272|    9372610|
|   Indonesia|        206611600|    1919440|
|      Brazil|        162661216|    8511965|
|      Russia|        148178480|   17075200|
|    Pakistan|        129275664|     803940|
|       Japan|        125449704|     377835|
|  Bangladesh|        123062800|     144000|
|     Nigeria|        103912488|     923770|
|     Germany|         83536112|     356910|
|     Vietnam|         73976976|     329560|
|        Iran|         66094264|    1648000|
|    Thailand|         58851356|     514000|
|      France|         58317448|     547030|
|       Italy|         57460272|     301230|
|    Ethiopia|         57171664|    1127127|
|     Ukraine|         50864008|     603700|
|       Zaire|         46498540|    2345410|
|       Burma|         45975624|     678500|
+------------+-----------------+-----------+

当我执行下面的操作时,输出

  Dataset<Row> ds3 = ds2.filter(ds2.col("countryPopulation").cast("int").$greater(100000))
        .join(ds1, ds1.col("countrySize")
                .equalTo(ds2.col("countrySize")));
  ds3.show();

但当我做下面的操作时,我会出错

  Dataset<Row> ds3 = ds2.filter(ds2.col("countryPopulation").cast("int").$greater(100000))
        .join(ds1, ds1.col("countrySize").cast(DataTypes.IntegerType)
                .equalTo(ds2.col("countrySize").cast(DataTypes.IntegerType)), "inner");
  ds3.show();
Exception in thread "main" org.apache.spark.sql.AnalysisException: Detected implicit cartesian product for INNER join between logical plans
Project [country#6.name AS countryName#2, country#6.population AS countryPopulation#3, country#6.area AS countrySize#4]
+- Filter (isnotnull(country#6) && (Contains(country#6.name, a) && ((cast(country#6.population as int) > 100000) && (cast(country#6.area as int) = cast(country#6.area as int)))))
   +- Generate explode(countries#0.country), [0], false, t, [country#6]
      +- Relation[countries#0] json

共有1个答案

卫博学
2023-03-14

我见过当where条件包含两个数据帧中的参数的函数调用时会发生笛卡尔联接。类似于df1.join(df2,aFunction(df1.column,df2.column)。在这里我不太清楚,但我怀疑正在发生类似的事情。

请在下面尝试获取在选择条件(而不是在Where)上应用的函数。

    Dataset<Row> ds1_1 = ds1.select(col("countrySize").cast(DataTypes.IntegerType).as("countrySize")) // add all columns here

    Dataset<Row> ds2_1 = ds2.select(col("countrySize").cast(DataTypes.IntegerType).as("countrySize"),ds2.col("countryPopulation").cast("int").as("countryPopulation")) // add all columns here

    Dataset<Row> ds3 = ds2.filter(ds2_1.col("countryPopulation").$greater(100000))
        .join(ds1_1, ds1_1.col("countrySize")
                .equalTo(ds2_1.col("countrySize")), "inner");
    ds3.show();
 类似资料:
  • 由于某种原因,当RuleExecutor应用名为CheckCartesianProducts的优化规则集时,这些逻辑计划的连接条件中似乎没有列(参见https://github.com/apache/spark/blob/v2.3.0/sql/catalys/src/main/scala/org/apache/spark/sql/catalys/optimizer/optimizer.scala#

  • 主要内容:Oracle CROSS JOIN子句简介,Oracle Cross Join示例在本教程中,您将学习如何使用Oracle 创建连接表的笛卡尔积。 Oracle CROSS JOIN子句简介 在数学中,给定两个集合和,的笛卡尔乘积是所有有序对(,)的集合,属于,属于。 要在Oracle中创建表的笛卡尔乘积,可以使用子句。 以下说明了子句的语法: 与其他连接(如或)不同,没有连接谓词的子句。 当执行两个没有关系的表的交叉连接时,将得到两个表的行和列的笛卡尔乘积。 当您想要生成大量

  • 问题内容: 我想在两个SELECT语句之间执行笛卡尔积 我希望结果是(1,2)与(3,4)的每种组合,例如: 问题答案: 您可以使用CROSS JOIN子句 其中MyTable1有两行,分别包含1和2;MyTable2有两行,分别包含3和4。

  • 直到现在,凡是我当作最真实、最可靠而接受的东西,都是从感官或通过感官得来的。不过,我有时觉得这些感官是骗人的,并且为了小心谨慎起见,对于一经骗过我们的东西就决不完全加以信任。 勒内·笛卡尔,《第一哲学沉思录》 如果有一段引述用来描述C语言编程的话,那就是它了。对于大多数程序员,C是极其可怕而且邪恶的。他就像是恶魔、撒旦,或者一个使用指针的花言巧语和对机器的直接访问来破坏你生产力的骗子洛基。于是,一