influxdb:多次写入多点与单点
Posted
技术标签:
【中文标题】influxdb:多次写入多点与单点【英文标题】:influxdb: Write multiple points vs single point multiple times 【发布时间】:2017-05-01 21:40:45 【问题描述】:我在我的项目中使用了 influxdb,当一次写入多个点时,我遇到了查询问题
我正在使用 influxdb-python 向 influxdb 写入 1000 个唯一点。
influxdb-python 中有一个函数叫influxclient.write_points()
我现在有两个选择:
-
每次(1000 次)写入每个点或
合并1000个点,把所有点写一次。
第一个选项代码看起来像这样(仅限伪代码)并且有效:
thousand_points = [0...9999
while i < 1000:
...
...
point = [thousand_points[i]] # A point must be converted to dictionary object first
influxclient.write_points(point, time_precision="ms")
i += 1
写完所有点后,当我写这样的查询时:
SELECT * FROM "mydb"
我得到了所有的 1000 分。
为了避免每次迭代中每次写入所增加的开销,我想探索一次写入多个点。 write_points
函数支持。
write_points(points, time_precision=None, database=None, 保留策略=无,标签=无,批处理大小=无)
写入多个时间序列名称。
参数:points(字典列表,每个字典代表 a point) – 要写入数据库的点列表
所以,我所做的是:
thousand_points = [0...999]
points = []
while i < 1000:
...
...
points.append(thousand_points[i]) # A point must be converted to dictionary object first
i += 1
influxclient.write_points(points, time_precision="ms")
有了这个变化,当我查询时:
SELECT * FROM "mydb"
结果我只得到 1 分。我不明白为什么。
任何帮助将不胜感激。
【问题讨论】:
你能添加一个单点的例子吗?我怀疑您正在将所有内容都写入一个没有指定时间戳的系列。 或者可能是同一点 1000 次。 【参考方案1】:我知道这一点在一年前就已经被问过了,但是,为了将多个数据点批量发布到 influxdb,每个数据点似乎都需要有一个唯一的时间戳,否则它将被不断地覆盖。
我会导入一个datetime
并将以下内容添加到for loop
中的每个数据点:
'time': datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ")
所以每个数据点应该看起来像......
'fields': data, 'measurement': measurement, 'time': datetime....
希望这对遇到此问题的其他人有所帮助!
编辑:阅读文档显示另一个唯一标识符是标签,因此如果您希望指定时间,则可以改为包含 'tag' : i
(假设每个迭代值都是唯一的)。 (不过这个我没试过)
【讨论】:
【参考方案2】:SeriesHelper
可能有一个很好的案例
本质上,你提前设置了一个SeriesHelper
类,每次发现要添加的数据点,你就打个电话。 SeriesHelper
将为您批量写入,每次写入最多 bulk_size
点
【讨论】:
如果标签和字段是预定义的,系列助手很棒,但如果我想创建一个系列点表怎么办?我需要动态的字段和标签。 我现在没有要测试的 influxdb 副本,所以我不确定。我曾经为不同的系列使用多个 SeriesHelper 子类。我不确定在单个系列中缺少/可选标签是否是一个好的计划。也许这是一个新问题的好话题?以上是关于influxdb:多次写入多点与单点的主要内容,如果未能解决你的问题,请参考以下文章