2016-07-19 2 views
1

Я пытаюсь объединить несколько DF вместе. Поскольку, как работает совместная работа, я получил одинаковое имя столбца, дублируемое во всем.Несколько последовательных соединений с pyspark

When called on datasets of type (K, V) and (K, W), returns a dataset of (K, (V, W)) pairs with all pairs of elements for each key.

# Join Min and Max to S1 
joinned_s1 = (minTime.join(maxTime, minTime["UserId"] == maxTime["UserId"])) 

# Join S1 and sum to s2 
joinned_s2 = (joinned_s1.join(sumTime, joinned_s1["UserId"] == sumTime["UserId"])) 

Я получил эту ошибку: "" Reference 'UserId' неоднозначно, может быть: UserId # 1578, # 3014 UserId .;»

Что такое правильный способ удаления W из мой набор данных однажды успешно присоединилось

ответ

2

Вы можете использовать равностепенные присоединиться:

minTime.join(maxTime, ["UserId"]).join(sumTime, ["UserId"]) 

псевдонимов:

minTime.alias("minTime").join(
    maxTime.alias("maxTime"), 
    col("minTime.UserId") == col("maxTime.UserId") 
) 

или ссылки родительской таблицы:

(minTime 
    .join(maxTime, minTime["UserId"] == maxTime["UserId"]) 
    .join(sumTime, minTime["UserId"] == sumTime["UserId"])) 

В качестве стороны, обратите внимание, вы цитируете RDD документы, не DataFrame из них. Это разные структуры данных и не работают одинаково.

Также похоже, что вы делаете что-то странное здесь. Предполагая, что у вас есть одна родительская таблица min, max и sum могут быть вычислены как простые скопления без join.

+0

Спасибо! Это сработало. @ zero323 - Я пробовал что-то вроде dfg = df.groupBy (df.UserId) .agg ({«Timer»: «sum», «Timer»: «min», «Timer»: «max», Timer ":" avg "," Actions ":" count "}), но появляется только AVG ... таким образом, использование соединения. Любое предложение? – Ahmet

+0

Создано новую тему, чтобы покрыть этот вопрос: http://stackoverflow.com/questions/38488817/pyspark-multiple-aggregation-funtions-on-a-single-column-of-a-dataframe – Ahmet

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