我正在尝试从Spark流数据源读取数据,按事件时间窗口,然后在窗口数据上运行自定义Python函数(它使用非标准Python库)。
我的数据框看起来像这样:
| Time | Value |
| 2018-01-01 12:23:50.200 | 1234 |
| 2018-01-01 12:23:51.200 | 33 |
| 2018-01-01 12:23:53.200 | 998 |
| ... | ... |
窗口似乎可以很好地与Spark SQL一起使用,使用类似的东西:
windowed_df = df.groupBy(window("Time", "10 seconds"))
...,windowing by event time in the Spark Structured Streaming docs上有一节,所以我认为这应该适用于Spark Structured Streaming。
到目前为止,非常好。
另外,我已经能够使用Spark Streaming(DStream)来应用我的自定义转换操作,该操作当前在传入流上运行(基本上,它假设数据以正确的窗口块进行,假设我正在尝试摆脱)。代码看起来像这样:
def my_analysis(input_rdd):
# convert RDD to native types (would also be possible from a DataFrame)
# run through various Python libs
# construct new RDD with results - 1 row, multiple values (could construct new DataFrame here instead)
my_dstream\
.map(deserialize_from_string)\
.transform(my_analysis)\
.map(serialize_to_string)\
.foreachRDD(write_to_sink)
我现在基本上想要将两者结合起来,所以做一些像:
df\
.groupBy(window("Time", "10 seconds"))\
.transform(my_analysis)\ # how do I do this with pyspark.sql.group.GroupedData?
.writeStream # ...
# OR:
my_dstream\
.map(deserialize_from_string)\
.window_by_event_time("10 seconds")\ # how do I do this with a DStream?
.transform(my_analysis)\
.map(serialize_to_string)\
.foreachRDD(write_to_sink)
知道我怎么能够完成上述任务?
我尝试过的事情:
min
/ max
/ avg
/ agg
和{{ 3}})。 agg
似乎最有用,但到目前为止我在该领域发现的最好的是使用collect_list
,如下所示: windowed_df.agg(collect_list("Value")).sort("window").show(20, False)
...但这意味着我丢失了时间戳。
我看过的其他事情: