Lintcode 642 · Moving Average from Data Stream

本文介绍了一个如何使用队列实现DataStreamAlgorithms中的MovingAverage算法,给定一个整数流和窗口大小,计算每个滑动窗口内整数的平均值。通过实例展示了如何使用该类进行操作。

642 · Moving Average from Data Stream
Algorithms
Easy
Description
Given a stream of integers and a window size, calculate the moving average of all integers in the sliding window.

Example
Example 1:

MovingAverage m = new MovingAverage(3);
m.next(1) = 1 // return 1.00000
m.next(10) = (1 + 10) / 2 // return 5.50000
m.next(3) = (1 + 10 + 3) / 3 // return 4.66667
m.next(5) = (10 + 3 + 5) / 3 // return 6.0000

解法1:用queue。

class MovingAverage {
public:
    /*
    * @param size: An integer
    */MovingAverage(int size) : _size(size), _sum(0.0) {
        
    }

    /*
     * @param val: An integer
     * @return:  
     */
    double next(int val) {
        q.push(val);
        _sum += val;
        if (q.size() > _size) {
            _sum -= q.front();
            q.pop();
        }
        return _sum / q.size();
    }
private:
    queue<int> q;
    int _size;
    double _sum;
};

/**
 * Your MovingAverage object will be instantiated and called as such:
 * MovingAverage obj = new MovingAverage(size);
 * double param = obj.next(val);
 */
(base) root@hadoop01:~# spark-submit --driver-memory 512m --executor-memory 512m --packages org.apache.spark:spark-sql-kafka-0-10_2.12:3.4.0 /mycode04/text06/DJ30Analysis.py :: loading settings :: url = jar:file:/usr/local/spark/jars/ivy-2.5.1.jar!/org/apache/ivy/core/settings/ivysettings.xml Ivy Default Cache set to: /root/.ivy2/cache The jars for the packages stored in: /root/.ivy2/jars org.apache.spark#spark-sql-kafka-0-10_2.12 added as a dependency :: resolving dependencies :: org.apache.spark#spark-submit-parent-564d986f-8064-411e-842e-a95dab3a4024;1.0 confs: [default] found org.apache.spark#spark-sql-kafka-0-10_2.12;3.4.0 in central found org.apache.spark#spark-token-provider-kafka-0-10_2.12;3.4.0 in central found org.apache.kafka#kafka-clients;3.3.2 in central found org.lz4#lz4-java;1.8.0 in central found org.xerial.snappy#snappy-java;1.1.9.1 in central found org.slf4j#slf4j-api;2.0.6 in central found org.apache.hadoop#hadoop-client-runtime;3.3.4 in central found org.apache.hadoop#hadoop-client-api;3.3.4 in central found commons-logging#commons-logging;1.1.3 in central found com.google.code.findbugs#jsr305;3.0.0 in central found org.apache.commons#commons-pool2;2.11.1 in central :: resolution report :: resolve 1194ms :: artifacts dl 41ms :: modules in use: com.google.code.findbugs#jsr305;3.0.0 from central in [default] commons-logging#commons-logging;1.1.3 from central in [default] org.apache.commons#commons-pool2;2.11.1 from central in [default] org.apache.hadoop#hadoop-client-api;3.3.4 from central in [default] org.apache.hadoop#hadoop-client-runtime;3.3.4 from central in [default] org.apache.kafka#kafka-clients;3.3.2 from central in [default] org.apache.spark#spark-sql-kafka-0-10_2.12;3.4.0 from central in [default] org.apache.spark#spark-token-provider-kafka-0-10_2.12;3.4.0 from central in [default] org.lz4#lz4-java;1.8.0 from central in [default] org.slf4j#slf4j-api;2.0.6 from central in [default] org.xerial.snappy#snappy-java;1.1.9.1 from central in [default] --------------------------------------------------------------------- | | modules || artifacts | | conf | number| search|dwnlded|evicted|| number|dwnlded| --------------------------------------------------------------------- | default | 11 | 0 | 0 | 0 || 11 | 0 | --------------------------------------------------------------------- :: retrieving :: org.apache.spark#spark-submit-parent-564d986f-8064-411e-842e-a95dab3a4024 confs: [default] 0 artifacts copied, 11 already retrieved (0kB/10ms) log4j:WARN No appenders could be found for logger (org.apache.spark.util.ShutdownHookManager). log4j:WARN Please initialize the log4j system properly. log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. Traceback (most recent call last): File "/mycode04/text06/DJ30Analysis.py", line 102, in <module> main() File "/mycode04/text06/DJ30Analysis.py", line 37, in main ).withWatermark("event_time", "40 days") # 水印设置 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/spark/python/lib/pyspark.zip/pyspark/sql/dataframe.py", line 1102, in withWatermark File "/usr/local/spark/python/lib/py4j-0.10.9.7-src.zip/py4j/java_gateway.py", line 1322, in __call__ File "/usr/local/spark/python/lib/pyspark.zip/pyspark/errors/exceptions/captured.py", line 175, in deco pyspark.errors.exceptions.captured.AnalysisException: Event time must be defined on a window or a timestamp, but event_time is of type date.; EventTimeWatermark event_time#23: date, 40 days +- Project [to_date(data#21.date, Some(yyyy-MM-dd), Some(Etc/UTC)) AS event_time#23, cast(data#21.close as decimal(10,2)) AS CAST(data.close AS DECIMAL(10,2))#26] +- Project [from_json(StructField(date,StringType,true), StructField(close,DoubleType,true), cast(value#8 as string), Some(Etc/UTC)) AS data#21] +- StreamingRelationV2 org.apache.spark.sql.kafka010.KafkaSourceProvider@1f8f1976, kafka, org.apache.spark.sql.kafka010.KafkaSourceProvider$KafkaTable@284bccf7, [startingOffsets=earliest, kafka.bootstrap.servers=localhost:9092, subscribe=dj30-topic], [key#7, value#8, topic#9, partition#10, offset#11L, timestamp#12, timestampType#13], StreamingRelation DataSource(org.apache.spark.sql.SparkSession@274c38ef,kafka,List(),None,List(),None,Map(kafka.bootstrap.servers -> localhost:9092, subscribe -> dj30-topic, startingOffsets -> earliest),None), kafka, [key#0, value#1, topic#2, partition#3, offset#4L, timestamp#5, timestampType#6]2.股市分析任务(进阶任务) 数据集采用dj30数据集,见教学平台。 本实验将使用两个移动均线策略,短期移动均线为10天,长期移动均线为40天。当短期移动均线越过长期移动均线时,这是一个买入信号,因为它表明趋势正在向上移动。这就是所谓的黄金交叉。同时,当短期移动均线穿过长期移动均线下方时,这是一个卖出信号,因为它表明趋势正在向下移动。这就是所谓的死亡交叉。两种叉形如下图所示: dj30.csv包含了道琼斯工业平均指数25年的价格历史。 编写kafka-producer发送数据,代码参考如下。 d0f1112ef99752e736f83c0d5466add 读取dj30.csv数据,代码参考如下: 84b542a9647561d5c9bdb30f603a354 要求: 1.设置流以将数据输入structed streaming。 2.使用structed streaming窗口累计 dj30sum和dj30ct,分别为价格的总和和计数。 3.将这两个structed streaming (dj30sum和dj30ct)分开产生dj30avg,从而创建10天MA和40天MA的移动平均值。 4.比较两个移动平均线(短期移动平均线和长期移动平均线)来指示买入和卖出信号。您的输出[dj30-feeder只有一个符号的数据:DJI,这是隐含的。这个问题的输出将是[(<日期>买入DJI),(<日期>卖出DJI),等等]。应该是[(<日期>买入<符号>),(<日期>卖出<符号>),等等]的形式。 #!/usr/bin/env python3 from pyspark.sql import SparkSession from pyspark.sql.functions import * from pyspark.sql.types import * from pyspark.sql.window import Window def main(): spark = SparkSession.builder \ .appName("DJ30TradingSignal") \ .config("spark.sql.shuffle.partitions", "2") \ .config("spark.streaming.stopGracefullyOnShutdown", "true") \ .getOrCreate() # ============================================ # 步骤1: 从Kafka读取结构化流 # ============================================ raw_stream = spark.readStream \ .format("kafka") \ .option("kafka.bootstrap.servers", "localhost:9092") \ .option("subscribe", "dj30-topic") \ .option("startingOffsets", "earliest") \ .load() # ============================================ # 步骤2: 数据解析与类型转换 # ============================================ schema = StructType([ StructField("date", StringType()), StructField("close", DoubleType()) ]) parsed_stream = raw_stream.select( from_json(col("value").cast("string"), schema).alias("data") ).select( to_date(col("data.date"), "yyyy-MM-dd").alias("event_time"), col("data.close").cast(DecimalType(10,2)) ).withWatermark("event_time", "40 days") # 水印设置 # ============================================ # 步骤3: 双时间窗口聚合 # ============================================ # 10天移动平均计算 ma10_stream = parsed_stream \ .groupBy(window(col("event_time"), "10 days", "1 day")) \ .agg(avg("close").alias("ma10")) \ .select( col("window.end").alias("window_time"), col("ma10") ) # 40天移动平均计算 ma40_stream = parsed_stream \ .groupBy(window(col("event_time"), "40 days", "1 day")) \ .agg(avg("close").alias("ma40")) \ .select( col("window.end").alias("window_time"), col("ma40") ) # ============================================ # 步骤4: 双流合并与信号检测 # ============================================ merged_stream = ma10_stream.join( ma40_stream, "window_time", "inner" ).withColumnRenamed("window_time", "signal_time") # 定义状态管理窗口 signal_window = Window.orderBy(col("signal_time")).rowsBetween(-1, 0) # 生成交易信号 signal_stream = merged_stream \ .withColumn("prev_ma10", lag("ma10", 1).over(signal_window)) \ .withColumn("prev_ma40", lag("ma40", 1).over(signal_window)) \ .withColumn("signal", when( (col("ma10") > col("ma40")) & (col("prev_ma10") <= col("prev_ma40")), concat(lit("BUY "), date_format(col("signal_time"), "yyyy-MM-dd")) ).when( (col("ma10") < col("ma40")) & (col("prev_ma10") >= col("prev_ma40")), concat(lit("SELL "), date_format(col("signal_time"), "yyyy-MM-dd")) ) ).filter(col("signal").isNotNull()) \ .select("signal") # ============================================ # 步骤5: 输出配置与检查点设置 # ============================================ query = signal_stream.writeStream \ .outputMode("update") \ .format("console") \ .option("truncate", "false") \ .option("checkpointLocation", "/tmp/dj30-checkpoint") \ .start() query.awaitTermination() if __name__ == "__main__": main()#!/usr/bin/env python3 import time import pandas as pd import os from kafka import KafkaProducer def main(): # 配置Kafka生产者 producer = KafkaProducer( bootstrap_servers='localhost:9092', value_serializer=lambda v: f"{v[0]},{v[1]}".encode('utf-8') ) # 加载数据集 dir_path = os.path.dirname(os.path.realpath(__file__)) df = pd.read_csv(f"{dir_path}/data/dj30.csv") df = df[['Long Date', 'Close']].dropna() # 发送数据到Kafka for _, row in df.iterrows(): message = (row['Long Date'], row['Close']) producer.send('dj30-topic', value=message) print(f"Sent: {message[0]} {message[1]:.2f}") time.sleep(0.1) # 控制发送速率 producer.flush() if __name__ == "__main__": main()D 19900102 1/2/90 2753.40991 2810.1499 2740.3999 2810.1499 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 206813 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900103 1/3/90 2808.22998 2822.94995 2799.06006 2809.72998 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 236171 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900104 1/4/90 2809.72998 2815.48999 2772.61011 2796.08008 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 243691 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900105 1/5/90 2796.07007 2802.05005 2769.62012 2773.25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 202943 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900108 1/8/90 2773.25 2798.41992 2762.15991 2794.37012 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 166112 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900109 1/9/90 2794.58008 2802.8999 2766 2766 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 157959 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900110 1/10/90 2766.20996 2768.12988 2729.31006 2750.63989 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 199502 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900111 1/11/90 2750.63989 2774.73999 2750.63989 2760.66992 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 157935 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900112 1/12/90 2760.87988 2760.87988 2682.81006 2689.20996 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 241798 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900115 1/15/90 2689.20996 2691.55005 2666.6001 2669.37012 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 186300 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900116 1/16/90 2669.37012 2692.62012 2641.20996 2692.62012 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 249975 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900117 1/17/90 2692.62012 2704.3501 2648.67993 2659.12988 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 213146 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900118 1/18/90 2659.12988 2670.21997 2633.75 2666.37988 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 227486 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900119 1/19/90 2665.32007 2686.01001 2665.32007 2677.8999 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 233569 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900122 1/22/90 2678.75 2681.08008 2600.22998 2600.44995 2767.43994 2042.447479 1317.455018 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 200614 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900123 1/23/90 2600.44995 2625.67993 2588.51001 2615.32007 2776.29248 2373.788758 1971.285035 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 225181 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900124 1/24/90 2615.32007 2615.54004 2553.37988 2604.5 2797.30249 2709.856263 2622.410035 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 280704 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900125 1/25/90 2604.5 2616.43994 2550.67993 2561.04004 2793.357545 2694.34253 2595.327515 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 221641 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900126 1/26/90 2561.04004 2583.56006 2522.52002 2559.22998 2782.42505 2683.723786 2585.022523 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 257288 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900129 1/29/90 2558.78003 2572.07007 2529.05005 2553.37988 2771.065003 2670.301239 2569.537475 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 165355 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900130 1/30/90 2553.37988 2562.61011 2519.13989 2543.23999 2767.919983 2661.071228 2554.222473 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 249117 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900131 1/31/90 2543.46997 2590.54004 2542.79004 2590.54004 2741.629943 2647.926208 2554.222473 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 225057 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900201 2/1/90 2590.32007 2598.6499 2580.17993 2586.26001 2717.472473 2635.847473 2554.222473 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 198021 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900202 2/2/90 2586.26001 2616.43994 2581.97998 2602.69995 2702.96753 2628.595001 2554.222473 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 186965 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900205 2/5/90 2602.69995 2625.67993 2598.6499 2622.52002 2677.58252 2615.902496 2554.222473 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 136522 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900206 2/6/90 2622.52002 2622.96997 2594.37012 2606.31006 2671.875 2616.736236 2561.597473 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 162101 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900207 2/7/90 2606.31006 2642.12012 2585.81006 2640.09009 2674.007445 2621.181213 2568.35498 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 207455 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900208 2/8/90 2640.09009 2664.86011 2631.97998 2644.37012 2661.944945 2621.033721 2580.122498 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 206243 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900209 2/9/90 2644.59009 2658.33008 2635.59009 2648.19995 2659.212463 2628.67749 2598.142518 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155854 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900212 2/12/90 2648.41992 2648.41992 2619.13989 2619.13989 2647.402465 2624.517486 2601.632508 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 124238 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900213 2/13/90 2619.13989 2631.97998 2600 2624.1001 2637.950013 2616.638764 2595.327515 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 189225 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900214 2/14/90 2624.1001 2639.63989 2615.54004 2624.32007 2637.950013 2611.486268 2585.022523 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 147304 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900215 2/15/90 2624.32007 2650.8999 2622.07007 2649.55005 2638.287538 2603.912506 2569.537475 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 181777 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900216 2/16/90 2649.55005 2658.11011 2633.33008 2635.59009 2642.400088 2598.31128 2554.222473 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 231257 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900220 2/20/90 2636.04004 2636.04004 2585.81006 2596.8501 2638.40259 2600.000031 2561.597473 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 174582 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900221 2/21/90 2596.8501 2596.8501 2565.32007 2583.56006 2633.390078 2600.535035 2567.679993 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 206801 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900222 2/22/90 2583.56006 2618.02002 2574.55005 2574.77002 2633.390078 2603.208803 2573.027528 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 211959 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900223 2/23/90 2574.77002 2581.31006 2548.41992 2564.18994 2633.390078 2605.827546 2578.265015 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 196027 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900226 2/26/90 2564.63989 2602.47998 2564.40991 2602.47998 2628.942568 2604.392549 2579.84253 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 177959 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900227 2/27/90 2602.47998 2630.17993 2601.3501 2617.12012 2632.885073 2606.363801 2579.84253 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 216999 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900228 2/28/90 2617.12012 2645.27002 2614.63989 2627.25 2631.59009 2605.71631 2579.84253 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 229855 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900301 3/1/90 2627.69995 2648.6499 2618.46997 2635.59009 2634.742555 2607.292543 2579.84253 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 232248 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900302 3/2/90 2636.70996 2660.36011 2636.48999 2660.36011 2648.255068 2614.752534 2581.25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 200987 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900305 3/5/90 2660.13989 2666.43994 2644.13989 2649.55005 2650.620058 2620.130036 2589.640015 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 197927 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900306 3/6/90 2649.55005 2677.47998 2644.13989 2676.80005 2658.72754 2630.377534 2602.027528 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 223320 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900307 3/7/90 2676.58008 2685.59009 2665.54004 2669.59009 2664.075075 2641.97632 2619.877565 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 225373 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900308 3/8/90 2669.37012 2699.55005 2668.46997 2696.16992 2673.027528 2650.59131 2628.155093 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 218526 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900309 3/9/90 2695.94995 2698.6499 2672.52002 2683.33008 2681.472535 2652.280061 2623.087588 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 217048 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900312 3/12/90 2683.33008 2690.77002 2669.13989 2686.70996 2683.950013 2648.423799 2612.897585 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 169636 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900313 3/13/90 2686.70996 2694.13989 2667.12012 2674.55005 2685.190003 2641.441285 2597.692568 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 201194 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900314 3/14/90 2674.77002 2694.59009 2672.30005 2687.84009 2685.190003 2632.516266 2579.84253 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 168420 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900315 3/15/90 2687.84009 2708.56006 2687.84009 2695.71997 2688.287475 2634.768738 2581.25 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 166697 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900316 3/16/90 2695.27002 2741.21997 2695.27002 2741.21997 2701.914978 2645.777496 2589.640015 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 363110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900319 3/19/90 2736.48999 2757.20996 2713.06006 2755.62988 2722.184935 2662.472473 2602.76001 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 174398 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900320 3/20/90 2755.62988 2768.23999 2733.78003 2738.73999 2732.827453 2676.71875 2620.610048 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 224018 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900321 3/21/90 2738.73999 2751.3501 2724.77002 2727.92993 2740.879943 2687.980011 2635.08008 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 147995 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900322 3/22/90 2727.69995 2731.31006 2678.6001 2695.71997 2740.879943 2692.033753 2643.187563 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 217089 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900323 3/23/90 2694.82007 2712.61011 2694.82007 2704.28003 2740.879943 2698.227509 2655.575075 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 190139 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900326 3/26/90 2704.28003 2727.03003 2704.28003 2707.65991 2740.879943 2702.477509 2664.075075 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 128438 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900327 3/27/90 2707.65991 2736.93994 2697.30005 2736.93994 2743.132445 2708.079986 2673.027528 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 143249 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900328 3/28/90 2736.70996 2745.71997 2727.03003 2743.68994 2743.749938 2712.611236 2681.472535 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 167074 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900329 3/29/90 2743.46997 2743.68994 2721.8501 2727.69995 2736.767455 2710.358734 2683.950013 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 150808 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900330 3/30/90 2727.03003 2729.05005 2701.3501 2707.20996 2728.997435 2707.093719 2685.190003 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 153952 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900402 4/2/90 2706.76001 2706.76001 2679.5 2700.44995 2728.997435 2706.05249 2683.107545 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 160456 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900403 4/3/90 2700.44995 2741.43994 2700.44995 2736.70996 2728.997435 2707.601226 2686.205018 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 180361 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900404 4/4/90 2736.26001 2746.8501 2714.86011 2719.37012 2732.37744 2713.373749 2694.370058 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 212469 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900405 4/5/90 2719.37012 2738.29004 2718.68994 2721.16992 2744.369933 2723.452484 2702.535035 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 136364 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900406 4/6/90 2721.16992 2729.5 2701.80005 2717.12012 2744.819945 2725.253723 2705.6875 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 121924 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900409 4/9/90 2716.88989 2729.28003 2714.63989 2722.07007 2743.07495 2727.674988 2712.275025 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 104933 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900410 4/10/90 2722.07007 2733.78003 2715.98999 2731.08008 2740.539978 2723.451233 2706.362488 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 131302 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900411 4/11/90 2730.86011 2740.98999 2723.6499 2729.72998 2734.065003 2719.847504 2705.630005 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 157576 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900412 4/12/90 2729.5 2756.76001 2728.83008 2751.80005 2737.330018 2722.381256 2707.432495 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 129994 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900413 4/13/90 2751.80005 2751.80005 2751.80005 2751.80005 2741.10254 2724.267518 2707.432495 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900416 4/16/90 2751.80005 2782.87988 2751.80005 2763.06006 2749.097535 2732.685029 2716.272523 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 195539 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900417 4/17/90 2763.06006 2769.13989 2741.43994 2765.77002 2758.107545 2740.117524 2722.127503 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 146212 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900418 4/18/90 2765.98999 2771.62012 2727.47998 2732.87988 2758.107545 2740.06128 2722.015015 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 191511 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900419 4/19/90 2733.33008 2734.01001 2709.22998 2711.93994 2758.107545 2737.358765 2716.609985 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 176316 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900420 4/20/90 2712.15991 2716.21997 2672.52002 2695.94995 2758.107545 2732.967499 2707.827453 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 249719 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900423 4/23/90 2695.94995 2695.94995 2656.97998 2666.66992 2758.107545 2725.338745 2692.569945 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 161262 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900424 4/24/90 2667.12012 2677.92993 2650.22998 2654.5 2753.377503 2716.384979 2679.392455 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 149187 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900425 4/25/90 2654.5 2674.77002 2654.28003 2666.43994 2744.70752 2707.798736 2670.889953 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1157786 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900426 4/26/90 2666.43994 2682.20996 2656.08008 2676.58008 2734.460023 2700.253754 2666.047485 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 158289 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900427 4/27/90 2676.12988 2681.31006 2644.13989 2645.05005 2725.787538 2693.215028 2660.642518 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 158473 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900430 4/30/90 2645.04004 2663.73999 2634.01001 2656.76001 2725.000063 2692.82129 2660.642518 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 142544 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900501 5/1/90 2656.76001 2677.03003 2656.76001 2668.91992 2733.670045 2697.156281 2660.642518 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 156532 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900502 5/2/90 2668.91992 2689.63989 2666.66992 2689.63989 2741.10254 2700.872529 2660.642518 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 165887 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900503 5/3/90 2689.63989 2710.59009 2689.63989 2696.16992 2749.097535 2704.870026 2660.642518 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 180830 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900504 5/4/90 2695.94995 2710.81006 2685.59009 2710.36011 2758.107545 2709.657533 2661.20752 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 155018 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900507 5/7/90 2710.36011 2730.17993 2706.31006 2721.62012 2753.377503 2707.602509 2661.827515 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 142514 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900508 5/8/90 2721.62012 2734.22998 2718.23999 2733.56006 2748.817505 2706.954986 2665.092468 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 140855 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900509 5/9/90 2733.56006 2735.13989 2717.34009 2732.87988 2741.27246 2709.544951 2677.817443 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 183110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900510 5/10/90 2732.87988 2746.62012 2726.3501 2738.51001 2734.457458 2707.376189 2680.29492 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 200325 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900511 5/11/90 2738.73999 2804.05005 2738.73999 2801.58008 2751.632508 2714.161224 2676.68994 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 314967 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900514 5/14/90 2800.23999 2853.46997 2800.23999 2821.53003 2773.625 2722.257476 2670.889953 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 305104 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900515 5/15/90 2821.30005 2829.16992 2807.40991 2822.44995 2796.017518 2731.032501 2666.047485 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 210977 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900516 5/16/90 2822.44995 2831.02002 2806.25 2819.67993 2816.309998 2738.476258 2660.642518 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 170311 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900517 5/17/90 2819.67993 2846.30005 2819.67993 2831.70996 2823.842468 2742.524994 2661.20752 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 190926 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900518 5/18/90 2831.70996 2831.93994 2811.81006 2819.90991 2823.842468 2742.834991 2661.827515 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 252516 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900521 5/21/90 2819.90991 2851.15991 2808.80005 2844.67993 2829.399963 2747.246215 2665.092468 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 194336 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900522 5/22/90 2846.30005 2870.26001 2835.1499 2852.22998 2837.537475 2757.704955 2677.872435 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 238496 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900523 5/23/90 2852.22998 2856.26001 2836.1001 2856.26001 2843.674988 2767.473724 2691.27246 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 198440 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900524 5/24/90 2855.79004 2860.77002 2842.97998 2855.55005 2852.179993 2778.313751 2704.44751 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 221297 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900525 5/25/90 2855.55005 2855.55005 2817.84009 2820.91992 2852.179993 2783.803773 2715.427553 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 162494 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900529 5/29/90 2820.91992 2871.43994 2819.72998 2870.48999 2856.744995 2790.675019 2724.605043 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 174814 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900530 5/30/90 2870.72998 2894.91992 2867.40991 2878.56006 2862.320008 2796.981263 2731.642518 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 251793 0 0 0 0 0 0 0 0 0 0 0 0 0 0 D 19900531 5/31/90 2878.56006 2888.52002 2869.31006 2876.65991 2867.597473 2809.61499 2751.632508 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 178090 0 0 0 0 0 0 0 0 0 0 0 0 0 0
最新发布
05-20
### 正确设置时间窗口和事件时间 在Spark Structured Streaming中,正确配置事件时间和时间窗口对于避免`AnalysisException`异常至关重要。以下是关于如何正确设置时间窗口和事件时间的具体方法: #### 1. **定义事件时间** 为了确保基于实际发生的交易时间而不是系统接收时间来处理数据流,需要明确定义事件时间字段并为其分配水印机制[^1]。这可以通过以下方式实现: ```python from pyspark.sql.functions import col, current_timestamp # 假设"event_time"是数据中的事件时间字段 data_stream = data_stream.withWatermark("event_time", "5 seconds").select( col("event_time"), col("value") ) ``` 这里设置了5秒的乱序容忍度,允许延迟到达的数据被正确归入对应的窗口。 #### 2. **创建滑动窗口** 根据需求,可以使用滑动窗口来进行动态统计。例如,“最近5分钟”的统计数据可以通过如下代码实现[^1]: ```python from pyspark.sql.functions import window windowed_counts = data_stream.groupBy( window(data_stream.event_time, "5 minutes", "1 minute") ).agg(avg(col("value")).alias("moving_average")) ``` 此代码片段实现了窗口长度为5分钟、步长为1分钟的滑动窗口,并计算了每组内的移动平均值。 #### 3. **状态管理和存储** 当涉及大量用户的状态时,建议利用Flink的RocksDB作为后台存储引擎以支持高效的状态管理。尽管这是针对Flink的例子,在Spark中也可以通过优化检查点目录以及合理设计聚合逻辑来提升性能。 #### 4. **解决非时间窗口问题** 如果遇到因缺少适当的时间窗口而引发的`AnalysisException`,则需确认是否已指定有效的窗口操作。如果没有,则应按照前述方法引入显式的窗口函数[^2]。 #### 5. **日期类型兼容性** 确保输入数据中的日期/时间字段格式一致且能够被正确定位解析非常重要。通常情况下,推荐采用标准ISO8601格式表示时间戳字符串以便于跨平台互操作性和减少潜在转换错误风险。 ```python # 转换自定义格式时间为TimestampType df = df.withColumn("timestamp", to_timestamp(df["Long Date"], "yyyy-MM-dd HH:mm:ss")) ``` 以上措施有助于构建健壮可靠的Spark Structured Streaming应用,从而有效规避诸如`AnalysisException`之类的常见运行期障碍。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值