InfluxDB允许您delete points基于WHERE tag='value'
条件,但不能使用字段值。
例如,如果您在一系列正浮点数(例如CPU利用率)中意外存储了值为-1的度量值,DELETE FROM metrics WHERE cpu=-1
将返回此错误:
删除期间WHERE子句中不支持的字段
答案 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