我正在使用sprigboot和influx客户端:https://github.com/influxdata/influxdb-java
我遇到一个问题,我试图从influx数据库中获取specif列,但是当我将列名放入查询中时却无法获取任何记录。但是,当我尝试使用select *时,我正在获取数据。
@Data
@Measurement(name = "layout")
public class LayoutMapper {
@Column(name = "id", tag=true)
private String id;
@Column(name = "linename", tag=true)
private String lineName;
@Column(name = "tenantid")
private String tenantName;
@Column(name = "layout")
private String layout;
}
要将POJO保存到数据库:
Point point = Point.measurementByPOJO(clazz.getClass()).addFieldsFromPOJO(pojoObject).build();
connection.query(new Query("CREATE RETENTION POLICY " + retentionPolicyName + " ON " + dbProperties.getDatabase() DURATION 1h REPLICATION 1 DEFAULT"));
connection.write(dbProperties.getDatabase(), retentionPolicyName, point);
工作方式:
select * from layout;
select layout from layout;
不起作用(提供空记录):
select linename from layout;
谁能暗示我在做什么错?
注意:观察它很奇怪,我们不能对字符串列选择查询有任何建议?
最佳答案
我认为influxdb-java客户端库创建用于访问数据的抽象的方法有点令人困惑。首先,这些列实际上都不是列。在InfluxDB中,您的数据使用以下数据模型(也称为线路协议)存储:measurement-name,tag-set field-set timestamp
“度量”是高级别的数据分组,它是字符串,“标签集”是键/值对的集合,可以将其视为对所有值进行索引和字符串化的元数据,而“字段集”是键/值对的集合,其中值可以是int64,float64,bool或string。与标签相比,字段未编制索引。
在LayoutMapper
类中,为tag=true
和id
设置linename
,这意味着这两个是测量中标记集的成员。标签用于以高性能方式查询字段。因此,它们通常位于WHERE子句中,而不是单独位于SELECT中。
在InfluxDB中,如果要返回特定标签,则SELECT子句必须至少包含一个字段。这就是为什么您只能从包括*
和layout
字段的查询中获得结果的原因。总而言之,请尝试以下操作:
SELECT layout, linename FROM layout;