Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pyspark:计算不同数据的有效方法;关于;来自高频固定频率数据的信号_Python_Apache Spark_Pyspark - Fatal编程技术网

Python Pyspark:计算不同数据的有效方法;关于;来自高频固定频率数据的信号

Python Pyspark:计算不同数据的有效方法;关于;来自高频固定频率数据的信号,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我正在使用Pyspark从一个高固定频率的数据源创建数据管道。也就是说,信号以设定的频率报告其状态,而不是在改变状态时报告。我知道如何做我需要做的事情,但我觉得有一种更有效的方法来做。我目前正在处理一个工作流,在这个工作流中,我需要确定来自源的不同“开”值的数量。数据采用以下结构: Signal_Value Timestamp Off 1 Off 2 On 3 On 4

我正在使用Pyspark从一个高固定频率的数据源创建数据管道。也就是说,信号以设定的频率报告其状态,而不是在改变状态时报告。我知道如何做我需要做的事情,但我觉得有一种更有效的方法来做。我目前正在处理一个工作流,在这个工作流中,我需要确定来自源的不同“开”值的数量。数据采用以下结构:

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函数来获得上一行。所以我可以做一个滞后,然后计算每一个“开”-“关”对的出现次数?是的,如果我想对了,这可能会更好。