2017-02-10 2 views
3

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

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'Detected cartesian product for INNER join between logical plans\nProject ... Use the CROSS JOIN syntax to allow cartesian products between these relations.;'

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

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

ответ

0

Следуя советам, попробуйте

df0.join(maxs, df0.catalog == maxs.catalogid, 'cross') 

В основном третий аргумент определяет тип соединения. Это решило ошибку, но результат может быть не таким, каким вы хотите.

Для решения этой проблемы я применяю псевдонимы. Проблема, как указано здесь, Why does spark think this is a cross/cartesian join, заключается в том, что структуры, участвующие в ваших преобразованиях, разделяют одну и ту же линию.

Смежные вопросы