2017-08-08 3 views
0

こんにちは私は1時間と15分で自分のレコードをグループ化したいと思います。私のデータセットがあるので spark sql in javaで時間のみを使用して(例:10:00:00 AM)時間単位でグループ化しますか?

、私はグループ平均の平均速度とカウントする上記データセットから

|Date |Time  | speed |avg| 
    |1/1/2016|10:00:00 AM|  21| 10| 
    |1/1/2016|10:00:00 PM|  45| 10| 
    |1/1/2016|11:15:00 AM|  35| 10| 
    |1/1/2016|12:15:00 PM|  25| 20| 
    |1/1/2016|01:30:00 AM|  15| 30| 

:私はスパークSQLで試してみました サンプルクエリは次のとおりです。

spark.sql(select Time, avg(speed),count(avg) from dataset group by Time) 
+0

は、なぜあなたはあなたのデータでAM/PMを持たないGROUP BY句に時間を抽出する必要がありますか?それはすでに24時間形式です。 – philantrovert

+0

@philantrovert ..Hi buddy私は12時間形式に変更しましたか?それはタイプミスでした – sathiyarajan

+0

時間に関係なく分単位でグループを意味しますか? – mtoto

答えて

1

あなたは上のgorupしたいデータを含む新しい列を作成することができます

import org.apache.spark.sql.functions; 
df = df.withColumn("hour", functions.concat(
       functions.split(df.col("Time"), " ").getItem(1), 
       functions.lit(":"), 
       functions.split(df.col("Time"), ":").getItem(0) 
      )); 
df.show(); 

+--------+-----------+-----+---+-----+ 
| Date|  Time|speed|avg| hour| 
+--------+-----------+-----+---+-----+ 
|1/1/2016|10:00:00 AM| 21| 10|10:AM| 
|1/1/2016|10:00:00 PM| 45| 10|10:PM| 
|1/1/2016|11:15:00 AM| 35| 10|11:AM| 
|1/1/2016|12:15:00 PM| 25| 20|12:PM| 
|1/1/2016|01:30:00 AM| 15| 30|01:AM| 
+--------+-----------+-----+---+-----+ 

次にあなたがこの上aggreagateできます新しい列:あなたはあまりにも日付でgoupする必要がある場合は、GROUPBYに日付を追加することができます

df = df.groupBy("hour") 
     .agg(functions.avg("speed"), functions.count("avg")); 
df.show(); 

+-----+----------+----------+ 
| hour|avg(speed)|count(avg)| 
+-----+----------+----------+ 
|10:AM|  21.0|   1| 
|12:PM|  25.0|   1| 
|11:AM|  35.0|   1| 
|10:PM|  45.0|   1| 
|01:AM|  15.0|   1| 
+-----+----------+----------+ 

df.groupBy("hour", "Date") 
    .agg(functions.avg("speed"), functions.count("avg")) 
    .show() 

+-----+--------+----------+----------+ 
| hour| Date|avg(speed)|count(avg)| 
+-----+--------+----------+----------+ 
|01:AM|1/1/2016|  15.0|   1| 
|10:AM|1/1/2016|  21.0|   1| 
|10:PM|1/1/2016|  45.0|   1| 
|12:PM|1/1/2016|  25.0|   1| 
|11:AM|1/1/2016|  35.0|   1| 
+-----+--------+----------+----------+ 
+0

ありがとうございました15分同じようにする方法を知っていますか? – sathiyarajan

0

時間から時間を抽出し、グループで使用する。

SELECT Extract(HOUR From TIME) AS time1, Avg(speed),Count(Avg) FROM DATASET GROUP BY time1 
+0

例外:(1行目、POS 20) == SQLの== SELECTエキス(時からHOUR) – sathiyarajan

0

あなたはScalaで以下のようにして、あなたが望むものを達成することができます

df.groupBy("Time").agg(avg("speed").as("average_speed"), count("avg").as("count_avg")) 
+0

{ ''、 ')'}期待 'から' 不一致入力Iは、Java – sathiyarajan

+0

を使用しています@rameshMaharajanデータフレームを呼び出す関数はjavaでも同じでなければなりません:)そうではありませんか? –

+0

一つのことは、一意の時間基準ではなく、時間単位でグループ化したいということです。 – sathiyarajan

0
val df = sc.parallelize(Array(
("1/1/2016","10:00:00 AM","21","10"), 
("1/1/2016","10:00:00 PM","45","10"), 
("1/1/2016","11:15:00 AM","35","10"), 
("1/1/2016","12:15:00 PM","25","20"), 
("1/1/2016","01:30:00 AM","15","30"))).toDF("date", "time", "speed", "avg") 

df.registerTempTable("dataset") 

あなたは、日付/時刻型に文字列を変換してから

sqlContext.sql(""" 
    SELECT hour(from_unixtime(unix_timestamp(concat_ws(" ", date, time), "dd/MM/YYYY hh:mm:ss aa"))) as hours, 
    avg(speed) as avg_speed, count(avg) as cnt_avg 
    from dataset 
    group by hour(from_unixtime(unix_timestamp(concat_ws(" ", date, time), "dd/MM/YYYY hh:mm:ss aa"))) 
""").show 

+-----+---------+-------+ 
|hours|avg_speed|cnt_avg| 
+-----+---------+-------+ 
| 1|  15.0|  1| 
| 10|  21.0|  1| 
| 11|  35.0|  1| 
| 12|  25.0|  1| 
| 22|  45.0|  1| 
+-----+---------+-------+ 
関連する問題