2017-09-28 9 views
2

스파크 데이터 프레임에서 생성 된 과 같은 이벤트 목록이 있습니다. 나는 스칼라와 함께 Spark 2.2.0을 사용하고있다. Spark Bucketizer - 요소가 없어도 모든 버킷을 표시합니다.

+-----+-----+----------+ |event|hour | day| +-----+-----+----------+ |event1| 18|2015-02-05| |event1| 17|2015-02-19| |event5| 18|2015-02-02| |event5| 19|2015-02-02| |event1| 1|2015-03-17| |event1| 0|2015-02-03| |event1| 20|2015-02-02| |event1| 22|2015-02-02| |event1| 23|2015-02-02| |event1| 18|2015-02-09| |event1| 19|2015-02-09| |event1| 21|2015-02-09| |event1| 21|2015-04-06| |event1| 23|2015-02-09| |event1| 20|2015-02-16| |event2| 19|2015-02-12| |event3| 18|2015-02-18| |event1| 22|2015-02-16| |event2| 17|2015-02-04| |event1| 23|2015-02-16| +-----+----+----------+ only showing top 20 rows

val events = df.select($"event", hour($"time") as "hour", to_date($"time", "yyyy-MM-dd") as "day") 

나는 시간마다 버킷을 생성하고 모든 시간을 일이 얼마나 많은 이벤트를 계산해야합니다. 그래서 내 접근 방식은 버킷 (24 개)을 만들고 아래에 표시된 것처럼 특정 시간대의 이벤트를 계산하는 것이 었습니다.
val splits = (0 to 24).map(_ * 1.0).toArray 
val bucketizer = new Bucketizer() 
    .setInputCol("hour") 
    .setOutputCol("bucket") 
    .setSplits(splits) 

val bucket = bucketizer.transform(events) 

val result = bucket.groupBy($"day", $"bucket").agg(count($"event").as("count")).orderBy(asc("bucket")) 

result.filter($"day" === "2015-05-21").orderBy(asc("bucket")).show() 

그리고 위의 코드의 결과

가 정확한지

+----------+------+-----+ | day|bucket|count| +----------+------+-----+ |2015-05-21| 0.0| 1| |2015-05-21| 2.0| 1| |2015-05-21| 11.0| 1| |2015-05-21| 17.0| 1| |2015-05-21| 18.0| 4| |2015-05-21| 19.0| 4| |2015-05-21| 21.0| 1| |2015-05-21| 22.0| 3| |2015-05-21| 23.0| 1| +----------+------+-----+

입니다.

+----------+------+-----+ | day|bucket|count| +----------+------+-----+ |2015-05-21| 0.0| 1| |2015-05-21| 1.0| 0| |2015-05-21| 2.0| 1| |2015-05-21| 3.0| 0| |2015-05-21| 4.0| 0| |2015-05-21| 5.0| 0| : : |2015-05-21| 11.0| 1| |2015-05-21| 12.0| 0| |2015-05-21| 13.0| 0| : : |2015-05-21| 17.0| 1| |2015-05-21| 18.0| 4| |2015-05-21| 19.0| 4| |2015-05-21| 20.0| 0| |2015-05-21| 21.0| 1| |2015-05-21| 22.0| 3| |2015-05-21| 23.0| 1| +----------+------+-----+

는 기본적으로, 어떤 이벤트가 어떤 생각을 0으로 채워해서는 안 한 빈 (버킷) 어떻게을 달성하기 위해이 같은 그러나 내가 무엇을 출력으로 기대했다입니까?

감사합니다.

+0

지금까지 시간 열과 양동이 열은 동일한 값을 포함해야합니다. 즉, 버킷 팅 단계는 필요하지 않습니다. – Shaido

+0

@Shaido 나는 내 요청에 아마 충분히 명확하지 않았다. 특정 시간에 이벤트가 발생하지 않을 수 있기 때문에 (예 : 1에서 2 사이의 이벤트는 발생하지 않음), 데이터 프레임에 1로 표시된 시간이 포함되지 않습니다. 그 이유는 모든 24 시간의 생성을 강제로하고 버킷 – geo

답변

0

이 Bucketizer를 사용하지 않고 내 현재 솔루션 (나는 아주 예쁜하지 인정)

val events = df.select($"event", hour($"time") as "hour", to_date($"time", "yyyy-MM-dd") as "day") 

val left = (0 to 24).toDF.withColumnRenamed("value", "hour") 
val right = or_counts.filter($"day" === "2015-05-21").groupBy($"hour").agg(count("event").as("count")).orderBy(asc("hour")) 

left.join(right, Seq("hour"), "left_outer").na.fill(0, Seq("count")).show() 

이며, 아래 그림과 같이이 코드가 뭔가를 반환 : 내 예상 된 결과였다

+----+-----+ |hour|count| +----+-----+ | 0| 1| | 1| 0| | 2| 1| | 3| 0| | 4| 0| | 5| 0| | 6| 0| | 7| 0| | 8| 0| | 9| 0| | 10| 0| | 11| 1| | 12| 0| | 13| 0| | 14| 0| | 15| 0| | 16| 0| | 17| 1| | 18| 4| | 19| 4| | 20| 0| | 21| 1| | 22| 3| | 23| 1| | 24| 0| +----+-----+

. 누군가가 더 좋은 해결책을 제시 할 수 있다면 그 대답을 받아 들일 것입니다.

감사합니다.