Исключение с Join и withColumn в Spark - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь присоединиться к следующим 2 фреймам данных:

val df1 = Seq(
      ("Verizon", "USA"),
      ("AT & T", "PK"),
      ("Verizon", "IND")
    ).toDF("Brand", "Country")

    val df2 = Seq(
      (8, "USA"),
      (64, "UK"),
      (-27, "DE")
    ).toDF("TS", "Country")

Если я присоединюсь так, это сработало:

df1.join(df2, Seq("Country")).count

Но когда я пытаюсь использовать withColumn () и lit () перед объединением (для замены значений столбца), выдается исключение:

df1.withColumn("Country", lit("USA")).join(df2, Seq("Country")).count

Исключение:

org.apache.spark.sql.AnalysisException: Detected implicit cartesian product for INNER join between logical plans
LocalRelation
and
Project
+- Filter (isnotnull(_2#680) && (USA = _2#680))
   +- LocalRelation [_1#679, _2#680]
Join condition is missing or trivial.
Either: use the CROSS JOIN syntax to allow cartesian products between these
relations, or: enable implicit cartesian products by setting the configuration
variable spark.sql.crossJoin.enabled=true;
  at org.apache.spark.sql.catalyst.optimizer.CheckCartesianProducts$$anonfun$apply$21.applyOrElse(Optimizer.scala:1124)
  at org.apache.spark.sql.catalyst.optimizer.CheckCartesianProducts$$anonfun$apply$21.applyOrElse(Optimizer.scala:1121)
  at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$2.apply(TreeNode.scala:267)
  at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$2.apply(TreeNode.scala:267)
  at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:70)
  at org.apache.spark.sql.catalyst.trees.TreeNode.transformDown(TreeNode.scala:266)
   ...

Это также работает, когда я использую crossjoin:

df1.withColumn("Country", lit("USA")).crossJoin(df2.filter(col("Country") === "USA"))

Но я не понимаю, почему он не работает с простым join . почему я должен использовать кросс-соединение , чтобы оно работало. Любая помощь будет оценена. Спасибо

1 Ответ

0 голосов
/ 22 января 2019

Spark анализатор обнаружил условие перекрестного соединения, когда вы собираетесь использовать внутреннее объединение.

Поскольку перекрестное соединение обходится дорого, поэтому поведение по умолчанию для исключения исключения, когда физический план обнаруживает состояние перекрестного соединения, когда запрос не использовал перекрестное соединениеявно.

Это происходит из-за того, что замененный столбец сформирован из литерала.

Объяснение поведения перекрестного соединения объясняется более подробно в потоке, упомянутом пользователем 10464355.

...