将具有多个标签的值写入 influxDB(使用 python)

Posted

技术标签:

【中文标题】将具有多个标签的值写入 influxDB(使用 python)【英文标题】:Writing values with multiple tags into influxDB (with python) 【发布时间】:2020-03-07 05:28:53 【问题描述】:

我正在使用(使用 DataFrameClient)将值(浮点数)写入 Influx 数据库,以及两个标签:ID 和时间戳

def write_to_influx(ID, value):
    df = pandas.DataFrame(data=[value],index=pandas.date_range(start=datetime.utcnow(), periods=1, freq='S'), columns=['value'])
    client.write_points(df, dataPointID, database="mydb")

在我的循环中,碰巧我多次连续写入同一个数据库,如下所示:

while True:

    value_1,value_2,value_3,value_4,value_5 = some_calculation(x,y,z)

    write_to_influx(value_1, ID_1)
    write_to_influx(value_2, ID_2)
    write_to_influx(value_3, ID_3)
    write_to_influx(value_4, ID_4)
    write_to_influx(value_5, ID_5)

有人告诉我,可以将这些写入请求批处理为一个,这样可以减少 Influx 的负载。

我从另一个脚本中窃取了write_to_influx 方法,而实际上我在掌握它时遇到了问题。在文档中它说

write_points(points, time_precision=None, database=None, retention_policy=None, tags=None, batch_size=None, protocol=u'json', consistency=None)

参数: points(字典列表,每个字典代表一个点) -- 要写入数据库的点列表

但是使用write_to_influx(value_1, ID_1),不仅仅是字典,而是传递了一个数据点ID。

类似于已经应用的方法和文档描述...如果我想将多个值写入多个数据点 ID,我应该传递一个字典列表和一个数据点 ID 列表吗?因为这似乎不起作用:

def write_values_to_influx(ID_list, value_list):

    indexes=pandas.date_range(start=datetime.utcnow().replace(tzinfo=pytz.UTC), periods=1, freq='S')

    dict_list=[]
    for value in value_list:
        df_new= pandas.DataFrame(data=[value],index=indexes)
        dict_list.append(df_new)

    client.write_points(dict_list, ID_list, database="mydb")

当真时:

value_1,value_2,value_3,value_4,value_5 = some_calculation(x,y,z)

ID_list=[ID_1,ID_2,ID_3,ID_4,ID_5]
value_list=[value_1,value_2,value_3,value_4,value_5]

write_values_to_influx(ID_list, value_list)

返回错误:

File "/vdp/base_functions.py", line 249, in write_values_to_influx
xyz@crVB    |     client.write_points(dict_list, ID_list, database="mydb")
xyz@crVB    |   File "/usr/lib/python3.6/site-packages/influxdb/_dataframe_client.py", line 123, in write_points
xyz@crVB    |     numeric_precision=numeric_precision)
xyz@crVB    |   File "/usr/lib/python3.6/site-packages/influxdb/_dataframe_client.py", line 282, in _convert_dataframe_to_lines
xyz@crVB    |     dataframe = dataframe.dropna(how='all').copy()

我的问题: 如何一次写入多个条目(到同一个数据库)? write_points 是 write 方法吗? DataFrameClient 呢?

【问题讨论】:

问题需要***.com/help/minimal-reproducible-example 很难,因为它需要设置一个 influxdb,对吧? 没有。什么是pd,ZWP? updateValues() 返回什么?那个属性dropna从哪里来? ....从您的描述中,这些问题是否清楚。抱歉,没有。当然不要在这里评论我的问题,而是做更好的描述/代码,我可以复制粘贴到我的编辑器中。 我重写了问题,感谢您的意见! 请记住,influx 需要您的积分采用特定格式。例如。每个点都必须有一个“时间”字段。您必须为每个点创建一个有效的字典。然后把这个dicts放在一个列表中,并将它们传递给influx客户端提供的write_points方法。 【参考方案1】:

https://influxdb-python.readthedocs.io/en/latest/api-documentation.html

write_points(points,time_precision=None,database=None,retention_policy=None,tags=None,batch_size=None,protocol=u'json',consistency=None)

参数: points(字典列表,每个字典代表一个点) -- 要写入数据库的点列表

您正在使用正确的函数client.write_points,只需发送数据点列表。

【讨论】:

仅供参考,现在有赏金,真的需要让它工作:)【参考方案2】:

请使用

write_api.write(bucket=bucket, record=points)

在influxdb 2.0 for python client.

【讨论】:

以上是关于将具有多个标签的值写入 influxDB(使用 python)的主要内容,如果未能解决你的问题,请参考以下文章

将带有标签的 pandas DF 写入 influxdb

如何正确地将订单簿数据写入具有相同时间戳的 influxdb

influxdb:多次写入多点与单点

超过每个标签的最大值限制 InfluxDB

插入带有多个标签的 InfluxDB 时“缺少标签键”

将 Python 字典写入 InfluxDB?