2017-12-13 3 views
0

Wie mehrere Zeilen in einzelne Zelle zusammengeführt werden, basierend auf ID mit PySpark? Ich habe einen Datenrahmen mit IDs und Produkten. Zuerst möchte ich die Produkte mit der gleichen ID zusammen in eine Liste zusammenführen, dann möchte ich die Anzahl der Vorkommen jeder eindeutigen Liste zählen.Wie mehrere Zeilen in einzelne Zelle basierend auf ID zusammenführen und dann zählen?

Eingabebeispiel 1:

id,product 
1,HOME 
1,mobile 
2,watch 
2,mobile 
3,HOME 
3,mobile 
4,cd 
4,music 
4,video 

Output:

product,count 
HOME-mobile,2 
mobile-watch,1 
cd-music-video,1 

Beispiel 2 mit SQL-Code:

Eingabebeispiel:

cloths,brad 
cloths,edu 
cloths,keith 
cloths,stef 
enter,andr 
enter,char 
enter,danny 
enter,lucas 

Code:

01.235.
SELECT 
    SS.SEC_NAME, 
    STUFF((SELECT '- ' + US.USR_NAME 
      FROM USRS US 
      WHERE US.SEC_ID = SS.SEC_ID 
      ORDER BY USR_NAME 
      FOR XML PATH('')), 1, 1, '') [SECTORS/USERS] 
FROM SALES_SECTORS SS 
GROUP BY SS.SEC_ID, SS.SEC_NAME 
ORDER BY 1 

Ausgang:

cloths,brad-edu-keith-stef 
enter,andr-char-danny-lucas 

In diesem Beispiel wird die Ausgabe nicht die Zählung, aber es sollte enthalten sein.

Ich möchte dies in PySpark anstelle von sql/Schwein zu lösen.

+0

Es ist ein einfacher Anwendungsfall für pyspark. Zeig uns was hast du probiert ?? – techprat

+0

ia m neu in pyspark Ich versuche schon mit Schwein Ich weiß nicht, wie mit pyspark tun, also brauche ich Hilfe für diese group_url = GROUP logdata by (url); X = FOREACH group_url { unique_users = DISTINCT logdata.name; GENE Flatten (Gruppe), COUNT (unique_users) AS UniqueUsers, unique_users wie Name, COUNT (Logdaten) als Zählungen;} STORE X in 'Output/bigdata_analytics_cleaned'; – kumar

+0

@kumar: Bitte verwenden Sie die Bearbeitungsfunktion und fügen Sie den Code der Frage selbst und nicht in einem Kommentar hinzu. Darüber hinaus scheint der Code, den Sie hier eingefügt haben, nicht die gleichen Spaltennamen zu enthalten wie in der Frage und scheint auch andere Dinge zu tun. – Shaido

Antwort

0

Sie können dies tun ist PySpark mit groupby. Erste Gruppe in der ID-Spalte und füge die Produkte zu einer einzigen sortierten Liste zusammen. Um die Anzahl dieser Listen zu ermitteln, verwenden Sie erneut groupby und aggregieren Sie mit count.

from pyspark.sql import functions as F 

df2 = (df 
    .groupby("id") 
    .agg(F.concat_ws("-", F.sort_array(F.collect_list("product"))).alias("products")) 
    .groupby("products") 
    .agg(F.count("id")).alias("count")) 

Dies sollten Ihnen einen Datenrahmen wie folgt geben:

+--------------+-----+ 
|  products|count| 
+--------------+-----+ 
| HOME-mobile| 2| 
| mobile-watch| 1| 
|cd-music-video| 1| 
+--------------+-----+ 
+0

Danke ich brauche Datenausgabe colum record seprate mit '-' EX: mobile- watch – kumar

+0

@ kumar: Für das zweite Beispiel (sql) verwenden Sie keine Anzahl. Ist das nötig oder nicht? – Shaido

+0

@kumar: Aktualisiert – Shaido

Verwandte Themen