Estoy usando Chispa 2.1.0.

Cuando yo ejecute el código siguiente estoy recibiendo un error de Chispa. Por qué? Cómo solucionarlo?

val i1 = Seq(("a", "string"), ("another", "string"), ("last", "one")).toDF("a", "b")
val i2 = Seq(("one", "string"), ("two", "strings")).toDF("a", "b")
val i1Idx = i1.withColumn("sourceId", lit(1))
val i2Idx = i2.withColumn("sourceId", lit(2))
val input = i1Idx.union(i2Idx)
val weights = Seq((1, 0.6), (2, 0.4)).toDF("sourceId", "weight")
weights.join(input, "sourceId").show

De Error:

scala> weights.join(input, "sourceId").show
org.apache.spark.sql.AnalysisException: Detected cartesian product for INNER join between logical plans
Project [_1#34 AS sourceId#39, _2#35 AS weight#40]
+- Filter (((1 <=> _1#34) || (2 <=> _1#34)) && (_1#34 = 1))
+- LocalRelation [_1#34, _2#35]
and
Union
:- Project [_1#0 AS a#5, _2#1 AS b#6]
:  +- LocalRelation [_1#0, _2#1]
+- Project [_1#10 AS a#15, _2#11 AS b#16]
+- LocalRelation [_1#10, _2#11]
Join condition is missing or trivial.
Use the CROSS JOIN syntax to allow cartesian products between these relations.;
at org.apache.spark.sql.catalyst.optimizer.CheckCartesianProducts$$anonfun$apply$19.applyOrElse(Optimizer.scala:1011)
at org.apache.spark.sql.catalyst.optimizer.CheckCartesianProducts$$anonfun$apply$19.applyOrElse(Optimizer.scala:1008)
at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$3.apply(TreeNode.scala:288)
at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$3.apply(TreeNode.scala:288)
at org.apache.spark.sql.catalyst.trees.CurrentOrigin$.withOrigin(TreeNode.scala:70)
at org.apache.spark.sql.catalyst.trees.TreeNode.transformDown(TreeNode.scala:287)
at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformDown$1.apply(TreeNode.scala:293)
at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformDown$1.apply(TreeNode.scala:293)
at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$5.apply(TreeNode.scala:331)
at org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:188)
at org.apache.spark.sql.catalyst.trees.TreeNode.transformChildren(TreeNode.scala:329)
at org.apache.spark.sql.catalyst.trees.TreeNode.transformDown(TreeNode.scala:293)
at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformDown$1.apply(TreeNode.scala:293)
at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$transformDown$1.apply(TreeNode.scala:293)
at org.apache.spark.sql.catalyst.trees.TreeNode$$anonfun$5.apply(TreeNode.scala:331)
at org.apache.spark.sql.catalyst.trees.TreeNode.mapProductIterator(TreeNode.scala:188)
at org.apache.spark.sql.catalyst.trees.TreeNode.transformChildren(TreeNode.scala:329)
at org.apache.spark.sql.catalyst.trees.TreeNode.transformDown(TreeNode.scala:293)
at org.apache.spark.sql.catalyst.trees.TreeNode.transform(TreeNode.scala:277)
at org.apache.spark.sql.catalyst.optimizer.CheckCartesianProducts.apply(Optimizer.scala:1008)
at org.apache.spark.sql.catalyst.optimizer.CheckCartesianProducts.apply(Optimizer.scala:993)
at org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1$$anonfun$apply$1.apply(RuleExecutor.scala:85)
at org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1$$anonfun$apply$1.apply(RuleExecutor.scala:82)
at scala.collection.IndexedSeqOptimized$class.foldl(IndexedSeqOptimized.scala:57)
at scala.collection.IndexedSeqOptimized$class.foldLeft(IndexedSeqOptimized.scala:66)
at scala.collection.mutable.WrappedArray.foldLeft(WrappedArray.scala:35)
at org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1.apply(RuleExecutor.scala:82)
at org.apache.spark.sql.catalyst.rules.RuleExecutor$$anonfun$execute$1.apply(RuleExecutor.scala:74)
at scala.collection.immutable.List.foreach(List.scala:381)
at org.apache.spark.sql.catalyst.rules.RuleExecutor.execute(RuleExecutor.scala:74)
at org.apache.spark.sql.execution.QueryExecution.optimizedPlan$lzycompute(QueryExecution.scala:73)
at org.apache.spark.sql.execution.QueryExecution.optimizedPlan(QueryExecution.scala:73)
at org.apache.spark.sql.execution.QueryExecution.sparkPlan$lzycompute(QueryExecution.scala:79)
at org.apache.spark.sql.execution.QueryExecution.sparkPlan(QueryExecution.scala:75)
at org.apache.spark.sql.execution.QueryExecution.executedPlan$lzycompute(QueryExecution.scala:84)
at org.apache.spark.sql.execution.QueryExecution.executedPlan(QueryExecution.scala:84)
at org.apache.spark.sql.Dataset.withTypedCallback(Dataset.scala:2791)
at org.apache.spark.sql.Dataset.head(Dataset.scala:2112)
at org.apache.spark.sql.Dataset.take(Dataset.scala:2327)
at org.apache.spark.sql.Dataset.showString(Dataset.scala:248)
at org.apache.spark.sql.Dataset.show(Dataset.scala:636)
at org.apache.spark.sql.Dataset.show(Dataset.scala:595)
at org.apache.spark.sql.Dataset.show(Dataset.scala:604)
... 48 elided
  • Acabo de descargar Chispa 2.1.0 desde el sitio web oficial y se presenta el mismo problema (en el local de shell). Chispa 2.1.1 funciona bien en su lugar.
  • Confirmado. Pude reproducir con 2.1.0 demasiado. Sí, 2.1.1 funciona bien. Scala no importa ya que yo uso la versión oficial que se construye con Scala 2.11.8 (y que es la razón por la que se retira como un «ruido»).
InformationsquelleAutor Gevorg | 2017-06-26

3 Comentarios

  1. 27

    Puede desencadenantes inner join después de encender la bandera

    spark.conf.set("spark.sql.crossJoin.enabled", "true")

    Usted también podría usar también la combinación cruzada.

    weights.crossJoin(input)

    o definir el Alias como

    weights.join(input, input("sourceId")===weights("sourceId"), "cross")

    Usted puede encontrar más información sobre la problema de CHISPA-6459 que se dice que se fija en 2.1.1

    Como ya ha utilizado 2.1.1 el tema debería haber sido corregido.

    Espero que esto ayude!

    • ninguna de las alternativas de trabajo para mí… exacto de la excepción. El problema que señaló que se supone que ya se han corregido en la versión de la Chispa que estoy usando.
    • Me he encontrado con la misma excepción en la misma versión y el alias trabajó para mí.
    • que están tratando de hacer?hacer una combinación concreta de la derecha, a la izquierda rightouter, leftouter etc.
    • Necesito hacer un «interior» de unirse y no funciona. No hay problema si me especificar «left_outer»
    • No necesito una combinación cruzada. Necesito un inner join.
    • «la chispa.sql.crossJoin.habilitado», «true permite su inner join.

  2. 5

    tl;dr Actualizar a Chispa 2.1.1. Es un problema en la Chispa de la que fue corregido.

    (Yo realmente deseaba yo también podría mostrar que el cambio exacto que fijo que en 2.1.1)

    • Hay una solución si no somos capaces de actualizar a la Chispa 2.1.1?
    • ¿sabe usted cómo los temas se fija? Tengo chispa 2.2 y yo todavía estoy recibiendo este problema donde chispa malinterpreta regular unirse como un producto cartesiano.
    • Yo también estoy todavía golpear a este problema en la Chispa 2.2, en una combinación que no tiene realmente un producto cartesiano (o una combinación que debe ser trivialmente inferido). La actualización no es una gran solución a menos que haya una revisión documentada en el lugar.
  3. 1

    Para mí:

    Dataset<Row> ds1 = sparkSession.read().load("/tmp/data");
    Dataset<Row> ds2 = ds1;
    ds1.join(ds2, ds1.col("name").equalTo(ds2.col("name"))) //got "Detected cartesian product for INNER join between logical plans"
    Dataset<Row> ds1 = sparkSession.read().load("/tmp/data");
    Dataset<Row> ds2 = sparkSession.read().load("/tmp/data");
    ds1.join(ds2, ds1.col("name").equalTo(ds2.col("name"))) //running properly without errors

    Estoy usando Chispa 2.1.0.

Dejar respuesta

Please enter your comment!
Please enter your name here