(Пример монетизации рекламы для блоков данных) Как найти последнее совпадение в потоке? - PullRequest
0 голосов
/ 25 октября 2018

В сообщении блога "Представление объединений Stream-Stream в Apache Spark 2.3" обсуждается объединение кликов с показами на основе их adId:

# Define watermarks
impressionsWithWatermark = impressions \
  .selectExpr("adId AS impressionAdId", "impressionTime") \
  .withWatermark("impressionTime", "10 seconds ")   # max 10 seconds late

clicksWithWatermark = clicks \
  .selectExpr("adId AS clickAdId", "clickTime") \
  .withWatermark("clickTime", "20 seconds")        # max 20 seconds late

# Inner join with time range conditions
impressionsWithWatermark.join(
  clicksWithWatermark,
  expr(""" 
   clickAdId = impressionAdId AND 
    clickTime >= impressionTime AND 
    clickTime <= impressionTime + interval 1 minutes    
    """
  )
)

Я хотел бы знатьесли возможно отфильтровать результирующий поток так, чтобы в каждый «интервал запроса» были включены только строки с последним clickTime.

Интервал запроса - это интервал, указанный в условии соединения запроса:

clickTime >= impressionTime AND 
clickTime <= impressionTime + interval 1 minutes

Таким образом, я мог бы получить следующую последовательность

{type:impression, impressionAdId:1, timestamp: 1}
{type:click, clickAdId:1, timestamp: 1}
{type:click, clickAdId:1, timestamp: 15}

И после t = 60 с или около того искра испускает следующую строку в кадре данных:

{impressionTimestamp: 1, clickTimestamp: 15: clickAddId: 1, impressionAdId: 1}

Я только разместил код на Python, потому чтоэто было то, что было в статье, ответы с кодом Java или Scala также приветствуются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...