java - 检测到逻辑计划之间的 INNER 连接的隐式笛卡尔积
问题描述
我正在尝试加入两个数据集
Ds1
+-------------+-----------------+-----------+
| 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
请问我应该如何同时投射和加入..?为什么会出现这个错误..?
这个“检测到逻辑计划之间的内部连接的隐式笛卡尔积”错误是什么意思?
解决方案
我已经看到当 where 条件包含带有来自两个数据帧的参数的函数调用时,会发生笛卡尔连接。类似的东西df1.join(df2, aFunction(df1.column, df2.column)
。在这里,我没有看到确切的内容,但我怀疑正在发生类似的事情。
尝试在下面获取在选择条件而不是在哪里应用的功能。
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();
推荐阅读
- java - Java 从 Python 服务器接收消息 - 套接字
- handler - Mybatis - 通过存储过程从 Oracle 中提取用户定义的类型
- java - 如何使用 @InheritInverseConfiguration 和 unmappedTargetPolicy = ReportingPolicy.ERROR 忽略未映射的目标属性
- r - R中有没有办法在MySQL的数据框中散列密码?
- python - 命令引发异常:TypeError: send() got an unexpected keyword for embed
- c# - 如何将数据行转换为通用模型类?
- nestjs - 如何在模块之间使用公共服务?
- javascript - 在 NestJs 和 ReactJS 中使用 websocket
- json - Azure Api 服务上的 JSON 反序列化失败
- akka - 识别终止的 Akka Stream 阶段