возникает искровое соединение Обнаружено декартово произведение для ВНУТРЕННЕГО соединения

У меня есть фрейм данных, и я хочу добавить для каждой строки new_col=max(some_column0), сгруппированной другим столбцом1:

maxs = df0.groupBy("catalog").agg(max("row_num").alias("max_num")).withColumnRenamed("catalog", "catalogid")
df0.join(maxs, df0.catalog == maxs.catalogid).take(4)

И во второй строке я получаю ошибку:

AnalysisException: u'Обнаружено декартово произведение для ВНУТРЕННЕГО соединения между логическими планами \ nПроект ... Используйте синтаксис CROSS JOIN, чтобы разрешить декартово произведение между этими отношениями .; '

Чего я не понимаю: почему искра находит здесь декартово произведение?

Возможный способ получить эту ошибку: я сохраняю DF в таблицу Hive, затем снова инициализирую DF как select from table. Или замените эти две строки запросом улья - неважно. Но я не хочу экономить DF.


person Alex Loo    schedule 10.02.2017    source источник


Ответы (3)


Как описано в Почему Spark считает, что это крест / декартово соединение, это может быть вызвано:

Это происходит потому, что вы присоединяетесь к структурам, имеющим одну и ту же родословную, и это приводит к тривиально равному условию.

А как было создано декартово произведение? Вы можете обратиться к Выявление и устранение ужасного декартова произведения.

person Frank.Chang    schedule 13.08.2018
comment
Лучше всего включать всю необходимую информацию в свой ответ, а не только в ссылку - ссылки могут сгнить, а текст ответа - нет (надеюсь) - person CertainPerformance; 13.08.2018

Я столкнулся с той же проблемой с декартовым произведением для моего соединения. Чтобы преодолеть это, я использовал псевдонимы на DataFrames. См. Пример

from pyspark.sql.functions import col

df1.alias("buildings").join(df2.alias("managers"), col("managers.distinguishedName") == col("buildings.manager"))
person Jack    schedule 06.06.2019

Постарайтесь сохранить фреймы данных перед присоединением к ним. Работал у меня.

person Utsav Bhatia    schedule 25.07.2019