2016-11-16 3 views
0

시간이 지남에 따라 특정 사용자가 있었던 지역을 나타내는 데이터 세트가 있습니다. 이 데이터 세트에서 각 위치에서 보낸 밤의 수를 계산하려고합니다. "밤을 보내다"는 말은 : 특정 날짜의 23시 59 분까지 사용자의 마지막 위치를 가져옵니다. 해당 사용자의 모든 관측 위치가 그 다음날 05:00까지 또는 아직없는 경우 첫 번째 요일이 전날의 마지막 시간과 일치하면 해당 위치에서 보낸 밤입니다. 내가 추측하고있어창에서 고정되는 열 값에 따라 카운터를 증가시키는 방법은 무엇입니까?

| Timestamp| User| Location| 
|1462838468|49B4361512443A4DA...|1| 
|1462838512|49B4361512443A4DA...|1| 
|1462838389|49B4361512443A4DA...|2| 
|1462838497|49B4361512443A4DA...|3| 
|1465975885|6E9E0581E2A032FD8...|1| 
|1457723815|405C238E25FE0B9E7...|1| 
|1457897289|405C238E25FE0B9E7...|2| 
|1457899229|405C238E25FE0B9E7...|11| 
|1457972626|405C238E25FE0B9E7...|9| 
|1458062553|405C238E25FE0B9E7...|9| 
|1458241825|405C238E25FE0B9E7...|9| 
|1458244457|405C238E25FE0B9E7...|9| 
|1458412513|405C238E25FE0B9E7...|6| 
|1458412292|405C238E25FE0B9E7...|6| 
|1465197963|6E9E0581E2A032FD8...|6| 
|1465202192|6E9E0581E2A032FD8...|6| 
|1465923817|6E9E0581E2A032FD8...|5| 
|1465923766|6E9E0581E2A032FD8...|2| 
|1465923748|6E9E0581E2A032FD8...|2| 
|1465923922|6E9E0581E2A032FD8...|2| 

나는 여기에 윈도우 함수를 사용할 필요가, 나는 과거에 다른 것들에 대한 PySpark을 사용했지만, 여기 시작하는 곳과 같은 손실에 조금입니다. 난 당신이 이벤트 출력 밤의 시리즈를받는 함수를 가질 필요합니까 결국 생각

답변

1

보냈다 ... 같은 (예를 들어 그냥 생각 얻을 수) : 다음

def nights_spent(location_events): 
    # location_events is a list of events that have time and location 

    location_events = sort_by_time(location_events) 

    nights = [] 

    prev_event = None 
    for event in location_events[1:]: 
     if prev_location is not None: 
      if next_day(prev_event.time, event.time) \ 
       and same_location(prev_event.location, event.location): 
       # TODO: How do you handle when prev_event 
       # and event are more than 1 day apart? 
       nights.append(prev_location) 

     prev_location = location 

    return nights 

를, 나는 좋은 첫 번째 방법은 사용자별로 그룹화하여 주어진 사용자에 대한 모든 이벤트 (위치 및 시간 포함)를 얻는 것입니다.

그런 다음 이벤트 목록을 위 함수에 공급하면 RDD에 모든 (user, nights_spent) 행이 표시됩니다. 당신이 시작하는 데 도움이

nights_spent_per_user = all_events.map(lambda x => (x.user, [(x.time, x.location)])).reduce(lambda a, b: a + b).map(x => (x[0], nights_spent(x[1]))) 

희망 :

그래서, 일반적으로, RDD은 같을 것입니다.

+0

고맙습니다. 나는이 주위에 내 머리를 감싸해야하지만 그것은 아주 좋은 시작 같다. –