2016-03-17 9 views
8

私はスパークデータフレームに日付でグループにしようとすると、グループごとに1列の一意の値カウントてるスパーク上の他のフィールドで、各グループの異なる要素を取得します:1.6データフレーム

test.json 
{"name":"Yin", "address":1111111, "date":20151122045510} 
{"name":"Yin", "address":1111111, "date":20151122045501} 
{"name":"Yln", "address":1111111, "date":20151122045500} 
{"name":"Yun", "address":1111112, "date":20151122065832} 
{"name":"Yan", "address":1111113, "date":20160101003221} 
{"name":"Yin", "address":1111111, "date":20160703045231} 
{"name":"Yin", "address":1111114, "date":20150419134543} 
{"name":"Yen", "address":1111115, "date":20151123174302} 

をとコード:pysparkと

import pyspark.sql.funcions as func 
from pyspark.sql.types import TimestampType 
from datetime import datetime 

df_y = sqlContext.read.json("/user/test.json") 
udf_dt = func.udf(lambda x: datetime.strptime(x, '%Y%m%d%H%M%S'), TimestampType()) 
df = df_y.withColumn('datetime', udf_dt(df_y.date)) 
df_g = df_y.groupby(func.hour(df_y.date))  
df_g.count().distinct().show() 

結果は

df_y.groupby(df_y.name).count().distinct().show() 
+----+-----+ 
|name|count| 
+----+-----+ 
| Yan| 1| 
| Yun| 1| 
| Yin| 4| 
| Yen| 1| 
| Yln| 1| 
+----+-----+ 

そして、私は期待していようなものですされていますこれはパンダで:

df = df_y.toPandas() 
df.groupby('name').address.nunique() 
Out[51]: 
name 
Yan 1 
Yen 1 
Yin 2 
Yln 1 
Yun 1 

各グループの固有の要素は、アドレスなどの別のフィールドでどのように取得できますか?

答えて

14

機能countDistinctを使用して、各グループの異なる要素のこのカウントを行う方法があります:

import pyspark.sql.functions as func 
from pyspark.sql.types import TimestampType 
from datetime import datetime 

df_y = sqlContext.read.json("/user/test.json") 
udf_dt = func.udf(lambda x: datetime.strptime(x, '%Y%m%d%H%M%S'), TimestampType()) 
df = df_y.withColumn('datetime', udf_dt(df_y.date)) 
df_g = df_y.groupby(func.hour(df_y.date))  
df_y.groupby(df_y.name).agg(func.countDistinct('address')).show() 

+----+--------------+ 
|name|count(address)| 
+----+--------------+ 
| Yan|    1| 
| Yun|    1| 
| Yin|    2| 
| Yen|    1| 
| Yln|    1| 
+----+--------------+ 

ドキュメントが(こちらhttps://spark.apache.org/docs/1.6.0/api/java/org/apache/spark/sql/functions.html#countDistinct(org.apache.spark.sql.Column、org.apache.spark.sql.Columnご利用いただけます。.. 。))。