Python Pyspark:计算不同数据的有效方法;关于;来自高频固定频率数据的信号
我正在使用Pyspark从一个高固定频率的数据源创建数据管道。也就是说,信号以设定的频率报告其状态,而不是在改变状态时报告。我知道如何做我需要做的事情,但我觉得有一种更有效的方法来做。我目前正在处理一个工作流,在这个工作流中,我需要确定来自源的不同“开”值的数量。数据采用以下结构:Python Pyspark:计算不同数据的有效方法;关于;来自高频固定频率数据的信号,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我正在使用Pyspark从一个高固定频率的数据源创建数据管道。也就是说,信号以设定的频率报告其状态,而不是在改变状态时报告。我知道如何做我需要做的事情,但我觉得有一种更有效的方法来做。我目前正在处理一个工作流,在这个工作流中,我需要确定来自源的不同“开”值的数量。数据采用以下结构: Signal_Value Timestamp Off 1 Off 2 On 3 On 4
Signal_Value Timestamp
Off 1
Off 2
On 3
On 4
On 5
Off 6
Off 7
On 8
On 9
Off 10
所以在这种情况下,不同的“开”信号的数量是2,即使“开”总共有5个值(我在这里将不同的信号定义为一组开)。现在,我的过程是选择数据,按时间戳排序,然后遍历整个信号列表,每次循环遇到当前信号为“开”而前一个信号为“关”的情况时,向计数变量添加1。循环浏览整个列表似乎效率低下。有更好的方法吗
有关更多详细信息,我的代码如下所示:
df = spark.sql("select id, signal_value, timestamp from database.table")
# Following functions used at the bottom for map() & reduceByKey() functions
def key_value_map(x):
key = x[0]
value = [tuple((x[1],x[2]))]
return (key,value)
def reduce(x):
return x+y # combining tuple-lists
def time_order(x):
id = x[0]
signal_list = x[1] # has structure: (signal_value, timestamp)
sorted_signal_list = sorted(signal_list, key=lambda x: x[1])
return (id, sorted_signal_list)
def metrics_map(x):
id = x[0]
signal_list = x[1] # has structure: (signal_value, timestamp)
count = 0
for i in range(1, len(signal_list)):
value = signal_list[i][0] # 0th element is signal_value
previous_value = signal_list[i-1][0]
if value == "On" and previous_value == "Off":
count += 1
return (id, count)
mapped = df.rdd.map(key_value_map)
reduced = mapped.reduceByKey(reduce)
mapped2 = reduced.map(time_order)
mapped3 = mapped2.map(metrics_map)
result = mapped3.collect()
有没有理由不使用DataFrameAPI而不是RDD?您可以添加预期的输出吗?我刚刚发现,对于这种类型的数据,使用RDD更容易;它为我提供了更细粒度的控制,并且对于我使用此数据源所做的工作类型来说似乎简单得多。尽管使用DataFrameAPI可能会更好地解决这个特定问题。输出将只是“on”信号的ID和不同出现次数的计数(参见上面“不同出现次数”的定义)。数据帧本身可以按列进行排序,在大型数据集上性能更好。否则,请使用数据库对内容进行排序您可以在数据帧中使用Spark sql lag函数来获得上一行。所以我可以做一个滞后,然后计算每一个“开”-“关”对的出现次数?是的,如果我想对了,这可能会更好。