Ошибка соединения набора данных Spark: условие соединения отсутствует или является тривиальным - PullRequest
0 голосов
/ 05 октября 2018

Я хочу объединить два набора данных в искре.Вот что я сделал:

Dataset<Row> data = spark.read().format("parquet").load("hdfs://path");
Dataset<Person> p1= data.filter("id < 200").as(Encoders.bean(Person.class)).alias("ds1");
Dataset<Person> p2= data.filter("id < 100").as(Encoders.bean(Person.class)).alias("ds2");
p1.joinWith(p2, p1.col("ds1.id").equalTo(p2.col("ds2.id")) ,"inner").show();

Когда я запустил программу, я получил эту ошибку:

Detected implicit cartesian product for INNER join between logical plans
Project [named_struct(id, id#3L, fname, fname#1, lname, lname#4, email, email#0, gender, gender#2) AS _1#41]
+- Filter (named_struct(id, id#3L, fname, fname#1, lname, lname#4, email, email#0, gender, gender#2).id = named_struct(id, id#3L, fname, fname#1, lname, lname#4, email, email#0, gender, gender#2).id)
   +- Relation[email#0,fname#1,gender#2,id#3L,lname#4] parquet
and
Project [named_struct(id, id#39L, fname, fname#37, lname, lname#40, email, email#36, gender, gender#38) AS _2#42]
+- Relation[email#36,fname#37,gender#38,id#39L,lname#40] parquet
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;

Что я понимаю из ошибки и смотрю в исходный код: он думаетчто это перекрестное соединение (строки 1311-1328), но это не так.

Я видел это решение и это говорит о том, что структуры имеют общую линию имы должны использовать псевдоним, и я использовал его, и это не сработало.Как я могу решить эту проблему?

Также есть сообщение об ошибке, связанное с этой проблемой: spark-25150

1 Ответ

0 голосов
/ 05 октября 2018

Без префиксов набора данных («p1.», «P2.») Возле «col» должны работать:

import static org.apache.spark.sql.functions.col;
p1.joinWith(p2, col("ds1.id").equalTo(col("ds2.id")) ,"inner").show();
...