繁体   English   中英

我的最佳方法是:根据抓取的数据创建计算表

[英]What's my best approach re: creating calculated tables based on scraped data

我的vps上每天都有几个Spider来抓取数据,并将数据存储在MySQL中。

我需要基于来自各种数据源的数据构建一个非常复杂的时间序列模型。

在这里,我遇到了一个问题:

我需要根据我的抓取数据创建一个新的计算表。 该模型非常复杂,因为它涉及历史原始数据和计算数据。 我打算编写一个python脚本来执行此操作,但是效率似乎不够。

然后,我意识到我可以在MySQL中创建一个视图并以嵌套sql查询的格式编写模型。 就是说,我希望视图能够实现(MySQL现在不支持该视图),并且可以在每天输入新数据时刷新视图。

我知道有一个名为flex ***的第三方插件,但我在网上搜索,安装和维护似乎并不容易。

我最好的方法是什么?

谢谢您的帮助。

================================================== =======================

为了澄清起见,我制作的时间序列模型非常复杂,它涉及:

  • 原始数据的滚动平均值
  • 以上滚动平均值数据上的滚动平均值

因此,它取决于原始数据和先前计算的数据。

时间戳记解决方案并不能真正解决问题的复杂性。

我只是不确定最好的方法。

抛开是否应该使用专用的时间序列工具(例如rrdtoolcarbon) ,mysql提供了实现半实体化视图所需的功能,例如,按日期合并的给定数据批处理:

SELECT DATE(event_time), SUM(number_of_events) AS events, 
, SUM(metric) AS total
, SUM(metric)/SUM(number_of_events) AS average
FROM (
  SELECT pc.date AS event_time, events AS number_of_events
  , total AS metric
  FROM pre_consolidated pc
  UNION
  SELECT rd.timestamp, 1
  , rd.metric
  FROM raw_data rd
  WHERE rd.timestamp>@LAST_CONSOLIDATED_TIMESTAMP 
) 
GROUP BY DATE(event_time)

(请注意,尽管您可以将其创建为视图并访问它,但IME,MySQL并不是最擅长优化涉及视图的查询,并且使用与上述等效的模板作为构建查询的模板可能会更好)

维护@LAST_CONSOLIDATED_TIMESTAMP准确记录的最灵活的方法是在raw_data表中添加一个状态列(以避免锁定和使用事务以确保一致性),并在事件的时间戳上添加索引,然后定期:

UPDATE raw_data 
SET state='PROCESSING' 
WHERE timestamp>=@LAST_CONSOLIDATED_TIMESTAMP
AND state IS NULL;

INSERT INTO pre_consolidated (date, events, total)
SELECT DATE(rd.timestamp), COUNT(*), SUM(rd.metric)
FROM raw_data
WHERE timestamp>@LAST_CONSOLIDATED_TIMESTAMP
AND state='PROCESSING'
GROUP BY DATE(rd.timestamp);

SELECT @NEXT_CONSOLIDATED_TIMESTAMP := MAX(timestamp)
FROM raw_data
WHERE timestamp>@LAST_CONSOLIDATED_TIMESTAMP
AND state='PROCESSING';

UPDATE raw_data
SET state='CONSOLIDATED'
WHERE timestamp>@LAST_CONSOLIDATED_TIMESTAMP
AND state='PROCESSING';

SELECT @LAST_CONSOLIDATED_TIMESTAMP := @NEXT_CONSOLIDATED_TIMESTAMP;

(您应该考虑一种在DBMS会话之间保留LAST_CONSOLIDATED_TIMESTAMP的方法)

因此,基本查询(以允许多个事件具有相同的时间戳记)应为:

SELECT DATE(event_time), SUM(number_of_events) AS events, 
, SUM(metric) AS total
, SUM(metric)/SUM(number_of_events) AS average
FROM (
  SELECT pc.date AS event_time, events AS number_of_events
  , total AS metric
  FROM pre_consolidated pc
  UNION
  SELECT rd.timestamp, 1
  , rd.metric
  FROM raw_data rd
  WHERE rd.timestamp>@LAST_CONSOLIDATED_TIMESTAMP
  AND state IS NULL
) 
GROUP BY DATE(event_time)

只要您合理地频繁应用合并,将状态变量添加到时间戳索引可能会减慢更新的整体性能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM