Pyspark-Kafka Streams的每个数据批次的平均值

时间:2018-12-07 14:36:17

标签: pyspark apache-kafka spark-streaming

我正在使用 Pyspark Kafka 通过直播流处理数据

我制作了一个函数,可以按批次读取Kafka流,并计算每个批次的数据的平均值

我想要相同的东西,但是第二批的值应该是第一批和第二批的值的平均值时(我是指整个历史记录)。对于第三批,平均值应该是第一批+第二批+第三批的平均值。等等。

更多信息,如果可以用最后一批的值计算出新值来更新,那就太好了:)

这是我到目前为止所做的:

from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark.streaming import StreamingContext
from pyspark.streaming.kafka import KafkaUtils
from pyspark.sql.types import *
from pyspark.sql.functions import *
import pandas as pd
import numpy as np
import json, time, os.path


kafka_brokers = "localhost:9092"
kafka_core_topic = "test"


sc = SparkContext(appName = "test-kafka")
sc.setLogLevel("ERROR")

ssc = StreamingContext(sc, 3)
kvs = KafkaUtils.createDirectStream(ssc, [kafka_core_topic], {"metadata.broker.list": kafka_brokers})

parsed = kvs.map(lambda x: json.loads(x[1]))

@pandas_udf('double')
def mean_score(col):
    return pd.Series([np.mean(col)] * len(col))

def getSparkSessionInstance(sparkConf):
if ("sparkSessionSingletonInstance" not in globals()):
    globals()["sparkSessionSingletonInstance"] = SparkSession \
        .builder \
        .config(conf = sparkConf)\
        .getOrCreate()
return globals()["sparkSessionSingletonInstance"]

def process(time, rdd):
    print("========= %s =========" % str(time))
    parquetfile = "sparkstream.parquet"

    spark = getSparkSessionInstance(rdd.context.getConf())

    schema = StructType([
        StructField('name', StringType()),
        StructField('score', IntegerType())
    ])

    data = spark.read.json(rdd, schema = schema)

    data = data.withColumn('mean_score', mean_score(data['score']))

    data.show()

    if os.path.isdir(parquetfile):
        data.write.mode('append').parquet(parquetfile)
    else:
        data.write.parquet(parquetfile)


parsed.foreachRDD(process)

ssc.start()
ssc.awaitTermination()

这将产生以下结果:

enter image description here

非常感谢您的帮助:)

0 个答案:

没有答案