1

我是 InfluxDB 2.0 的新手,正在构建一个时间序列数据库,我在其中存储每个点的多个字段(XAUUSD 货币的价格值)。

虽然我能够按预期存储它;当我获取记录时,我似乎无法获得每条记录可访问的所有字段。

这是我如何将一些虚拟数据写入数据库的代码片段:

from datetime import datetime
import time
import influxdb_client
from influxdb_client.client.write_api import SYNCHRONOUS
import random

token = "XXX"
org = "Trader"
bucket = "Master"
url="http://localhost:8086"

client = influxdb_client.InfluxDBClient(
    url=url,
    token=token,
    org=org
)

write_api = client.write_api(write_options=SYNCHRONOUS)
while True:
    p = influxdb_client.Point("D1").tag("currency", "XAUUSD").field("open", random.randint(900,1100)).field("close", random.randint(900,1100)).time(datetime.utcnow(), influxdb_client.WritePrecision.NS)
    write_api.write(bucket=bucket, org=org, record=p)
    time.sleep(1)

我正在尝试将数据读回:

query_api = client.query_api()
query = ' from(bucket:"Master")\
|> range(start: -5h)\
|> filter(fn:(r) => r._measurement == "D1")\
|> filter(fn: (r) => r.currency == "XAUUSD")\
|> filter(fn:(r) => r["_field"] == "close" or r["_field"] == "open")'

result = client.query_api().query(org=org, query=query)

for table in result:
  for record in table.records:
    results.append((record.get_field(), record.get_value()))

print(results)

问题是; 每行结果如下:

{'result': '_result', 'table': 1, '_start': datetime.datetime(2021, 5, 4, 8, 58, 35, 12587, tzinfo=tzutc()), '_stop': datetime.datetime(2021, 5, 4, 13, 58, 35, 12587, tzinfo=tzutc()), '_time': datetime.datetime(2021, 5, 4, 13, 12, 56, 86095, tzinfo=tzutc()), '_value': 961, '_field': 'open', '_measurement': 'D1', 'currency': 'XAUUSD'}

并且它没有显示两个字段;打开和关闭(它们显示为单独的行,其中 _field 对于一个条目是“打开”,对于第二个条目是“关闭”对于同一条目。

有没有办法让结果行在一个结果中包含两个字段值而不是 2;每个字段 1 个?因为如果我添加更多字段,我将不得不找到一种方法来组合n行以获得相同的价格变动。

我试图通过 InfluxDB 文档但是所有的例子都只显示一个 _field 值而不是多个。

网上有一些答案使用带有正则表达式的数据透视,但我认为这不适合我的情况,在 MySQL 中这样的简单查询将是:

SELECT open, close FROM XAUUSD WHERE interval="D1";

关于如何使用 InfluxDB 解决这个“简单”任务的任何想法或帮助,或者我只是使用了错误的工具来完成这项工作?

4

2 回答 2

1

我有同样的问题。
这个链接帮助了我。

将字段转入列
使用 pivot() 将 mem_used 和 mem_total 字段转入列。输出包括 mem_used 和 mem_total 列,其中包含每个对应 _time 的值。

query = ' from(bucket:"Master")\
|> range(start: -5h)\
|> filter(fn:(r) => r._measurement == "D1")\
|> filter(fn: (r) => r.currency == "XAUUSD")\
|> filter(fn:(r) => r["_field"] == "close" or r["_field"] == "open")\
|> pivot(rowKey: ["_time"], columnKey: ["_field"], valueColumn: "_value")'  # <- Add this
于 2021-07-19T21:57:34.603 回答
0

您可以尝试使用join运算符。像这样:

close_stream = from(bucket:"Master")
|> range(start: -5h)
|> filter(fn:(r) => r._measurement == "D1" and r._field == "close")
|> filter(fn:(r) => r.currency == "XAUUSD")

open_stream = from(bucket:"Master")
|> range(start: -5h)
|> filter(fn:(r) => r._measurement == "D1" and r._field == "open")
|> filter(fn:(r) => r.currency == "XAUUSD")

join(
    tables: {close: close_stream, open: open_stream},
    on: [
        "_time",
        "XAUUSD",
        "_measurement",
        "_stop",
        "_start",
    ],
)

但它在大流上存在性能问题

于 2022-01-28T07:31:01.710 回答