PySpark流媒体:窗口和转换

时间:2018-01-30 21:30:11

标签: apache-spark pyspark pyspark-sql spark-structured-streaming

我正在尝试从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)

知道我怎么能够完成上述任务?

我尝试过的事情:

  • 我可以在windowed_df上运行的函数看起来非常有限,基本上IPython建议我只能在这里进行聚合(min / max / avg / agg和{{ 3}})。 agg似乎最有用,但到目前为止我在该领域发现的最好的是使用collect_list,如下所示:
    windowed_df.agg(collect_list("Value")).sort("window").show(20, False)

...但这意味着我丢失了时间戳。

我看过的其他事情:

0 个答案:

没有答案