2017-12-13 10 views
0

PySparkを使用して複数の行をidに基づいて単一のセルにマージする方法はありますか?私はIDと製品のデータフレームを持っています。まず、同じIDの製品をリストにまとめて、各固有リストの出現回数を数えたいと思います。IDに基づいて複数の行を単一のセルにマージしてから数える方法は?

入力例1:

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

出力:

入力例:

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

コード:

SQLコードで

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

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 

出力:

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

この例では、出力は、カウントを持っていないが、それは含まれなければなりません。

私はこれをPythonの代わりにPySparkで解決したいと考えています。

+0

それはpysparkのための簡単な使用例です:

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")) 

これはあなたにこのようなデータフレームを与える必要があります。何を試してみましたか? – techprat

+0

私はpysparkの新しい私はすでに豚と私はどのようにpysparkと私はそのグループのための助けが必要なのか分からないとしようとする= group logdata by(url); X = FOREACH group_url { unique_users = DISTINCT logdata.name; FLATTEN(グループ)名としてUniqueUsers、unique_users、カウントとして COUNT(LOGDATA)AS、COUNT(unique_users)を生成し;} STORE Xに '出力/ bigdata_analytics_cleaned'。 – kumar

+0

@kumar:編集機能を使用して、コメントではなく質問自体にコードを追加してください。さらに、ここに貼り付けたコードには、質問と同じ列名が含まれていないようで、他のものも同様に扱われているようです。 – Shaido

答えて

0

groupbyを使用してPySparkを実行できます。 ID列の最初のグループを作成し、それらの製品を1つのソート済みリストにまとめます。そのようなリストの数のカウントを取得するには、groupbyを再度使用し、countで集計します。

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

ありがとう データ出力の列レコードセプレートに ' - 'が必要ですEX:mobile-watch – kumar

+0

@kumar:2番目の例(sql)ではカウントを使用しません。それは必要かどうか? – Shaido

+0

@kumar: – Shaido

関連する問題