使用来自InfluxDB测量的不需要的字段值删除点

时间:2016-09-25 09:01:36

标签: delete-row influxdb

InfluxDB允许您delete points基于WHERE tag='value'条件,但不能使用字段值。

例如,如果您在一系列正浮点数(例如CPU利用率)中意外存储了值为-1的度量值,DELETE FROM metrics WHERE cpu=-1将返回此错误:

  

删除期间WHERE子句中不支持的字段

3 个答案:

答案 0 :(得分:6)

这在InfluxDB中是不可能的 - 请参阅ticket 3210

您可以通过在测量中插入具有相同timestamp and tag set的点来覆盖具有其他值的点:

  

点由测量名称,标记集和时间戳唯一标识。如果您使用相同的度量,标记集和时间戳作为现有点提交新点,则字段集将成为旧字段集和新字段集的并集,其中任何绑定都将转到新字段集。这是预期的行为。

由于您not supposed to insert nulls,您可能希望重复上一个点的值。

您可能会考虑插入具有相同时间戳的点,并为其中一个标记设置唯一值,然后针对该标记运行删除:

DELETE FROM measurement WHERE some_existing_tag='deleteme'

但这不会奏效。您最终会得到两个具有相同时间戳的点,其中一个点具有deleteme标记。

答案 1 :(得分:2)

昂贵的方法

# Copy all valid data to a temporary measurement
SELECT * INTO metrics_clean FROM metrics WHERE cpu!=-1

# Drop existing dirty measurement
DROP measurement metrics

# Copy temporary measurement to existing measurement
SELECT * INTO metrics FROM metrics_clean

提示-如果您知道在哪个时间范围内有脏数据,请添加该数据并将DROP查询替换为DELETE

答案 2 :(得分:0)

丑陋而缓慢但相当健壮的解决方案:存储时间戳,然后按时间戳删除条目

curl -G 'http://localhost:8086/query?db=smarthome' \
  --data-urlencode "q=SELECT * FROM metrics WHERE cpu=-1" |\
  jq -r "(.results[0].series[0].values[][0])" > delete_timestamps.txt

for i in $(cat delete_timestamps.txt); do
  echo $I;
  curl -G 'http://localhost:8086/query?db=DATABASE' \
    --data-urlencode "q=DELETE FROM metrics WHERE time='$i'"; 
done