Open mstump opened 5 years ago
It turns out that this is only reproducible if the field is a datetime
and not if the field is a float
.
The code snip-it below works as anticipated.
import asyncio
import faust
import random
import string
import uuid
import time
from faust import windows
class PageView(faust.Record):
id: str = None
user: str = None
occurred_at: float = None
start_time = time.time()
ttl = 4
app = faust.App(
'page_view_windows',
broker='kafka://localhost:9092',
topic_partitions=4,
)
page_view_topic = app.topic('page_views', value_type=PageView)
active_users_table = app.Table(
'active_users',
default=None).tumbling(
ttl,
expires=timedelta(seconds=30),
key_index=True
).relative_to_field(PageView.occurred_at)
@app.timer(interval=2, on_leader=True)
async def generator():
user = ''.join(random.choices(string.ascii_uppercase + string.digits, k=7))
page_view = PageView(str(uuid.uuid4()), user, time.time())
await page_view_topic.send(value=page_view)
@app.agent(page_view_topic)
async def print_windowed_events(stream):
async for page_view in stream:
active_users_table[page_view.user] = page_view.occurred_at
print('-- New Event (every 2 secs) --')
print(f"seconds since start: {page_view.occurred_at - start_time}")
print(f"{len(active_users_table.keys())}, {repr([k for (k,v) in active_users_table.items()])}")
print(f"{repr([k for (k,v) in active_users_table.items().delta(ttl)])}")
Note: You can have datetimes in json models using the isodates
option like this:
class PageView(faust.Record, isodates=True, serializer='json'):
id: str = None
user: str = None
occurred_at: datetime = None
Thanks for the note about isodates, missed that in the docs until I started reading the model code.
@mstump could you please post your page_view_json
data? I'm trying to refer your example to build an example process. Wondering how the structure of your incoming data is.
@mstump - does the problem go away if you disable Cython? You can do so by setting the environment variable NO_CYTHON=True
Checklist
master
branch of Faust.Steps to reproduce
Expected behavior
Delta window should include items from time window at the specified delta.
Actual behavior
When
window.relative_to_field
is useditems
for delta windows are always empty.Versions
Python 3.7.1
Version 1.3.2 and master on commit be0f5709cf6a533d039c33b49af70e2496b5ad30
OSX
1.8.0_162