2016-07-14 23 views
5

Mam dane w dataframe jak poniżej:jak uzyskać maks. (Datę) z podanego zestawu danych pogrupowanych według niektórych pól za pomocą pyspark?

datetime    | userId | memberId | value |  
2016-04-06 16:36:... | 1234 | 111  | 1 
2016-04-06 17:35:... | 1234 | 222  | 5 
2016-04-06 17:50:... | 1234 | 111  | 8 
2016-04-06 18:36:... | 1234 | 222  | 9 
2016-04-05 16:36:... | 4567 | 111  | 1 
2016-04-06 17:35:... | 4567 | 222  | 5 
2016-04-06 18:50:... | 4567 | 111  | 8 
2016-04-06 19:36:... | 4567 | 222  | 9 

muszę znaleźć max (datetime) GroupBy userid, memberid. Kiedy próbowałem jak poniżej:

df2 = df.groupBy('userId','memberId').max('datetime') 

Dostaję błąd jako:

org.apache.spark.sql.AnalysisException: "datetime" is not a numeric 
column. Aggregation function can only be applied on a numeric column.; 

Wyjście chciałem się następująco:

userId | memberId | datetime 
1234 | 111  | 2016-04-06 17:50:... 
1234 | 222  | 2016-04-06 18:36:... 
4567 | 111  | 2016-04-06 18:50:... 
4567 | 222  | 2016-04-06 19:36:... 

Czy ktoś mógłby mi pomóc jak mogę maksymalna data wśród danych za pomocą ramek danych PySpark?

Odpowiedz

7

Dla nienumeryczny ale Orderable typów można użyć agg z max bezpośrednio:

from pyspark.sql.functions import col, max as max_ 

df = sc.parallelize([ 
    ("2016-04-06 16:36", 1234, 111, 1), 
    ("2016-04-06 17:35", 1234, 111, 5), 
]).toDF(["datetime", "userId", "memberId", "value"]) 

(df.withColumn("datetime", col("datetime").cast("timestamp")) 
    .groupBy("userId", "memberId") 
    .agg(max_("datetime"))) 

## +------+--------+--------------------+ 
## |userId|memberId|  max(datetime)| 
## +------+--------+--------------------+ 
## | 1234|  111|2016-04-06 17:35:...| 
## +------+--------+--------------------+ 
+0

dziękuję mi to pomogło. Ale, czy możesz wyjaśnić, czy musimy robić to samo, co w pierwszym kroku. Mam już ramkę danych we wspomnianym formacie jak w Q. Przepraszam, jeśli moje zapytanie jest podstawowe, ponieważ jestem początkującym użytkownikiem. – cool716

+0

Nie musisz łączyć się równolegle. Tutaj tworzę ramkę danych, aby dostarczyć powtarzalny przykład. – zero323

+0

Dziękuję. Ponadto, jeśli mam 2 kolumny dat, w jaki sposób mogę uzyskać maksimum każdej z tych samych kolumn grupowania? Oto df: df = sc.parallelize ([ ("2016-04-06 16:36", "2016-04-05 16:36", 1234, 111, 1), ("2016-04- 06 17:35 "," 2016-04-08 17:35 ", 1234, 111, 5), ]). ToDF ([" datetime1 "," datetime2 "," userId "," memberId "," value " ]) – cool716