Apache IoTDB tutorial series-2: operaciones básicas de SQL

Hoy presentamos principalmente SQL de uso común, incluida la adición, eliminación, modificación y verificación de metadatos y datos. El SQL de este artículo se basa en 0.10.0. ¡Esta versión principal se lanzará pronto!

El cuerpo del texto tiene 11018 palabras (principalmente SQL e información impresa, no muchos caracteres chinos) y el tiempo de lectura estimado es de 10 minutos.

En la actualidad, IoTDB tiene dos interfaces principales: SQL y NoSQL. Hoy, presentaré la interfaz SQL. Para facilitar la comprensión, puede descargar la versión preliminar 0.10.0 en el enlace a continuación y probarla mientras mira:

Enlace de descarga de la versión binaria:

https://pan.baidu.com/s/1KWnEIIE0Duwr9TZVugib6w  

Contraseña: dmrg

También puede compilar el código fuente:

git clone https://github.com/apache/incubator-iotdb.git
cd incubator-iotdb
git fetch origin rel/0.10:rel/0.10
git checkout rel/0.10
mvn clean package -pl distribution -am -DskipTests
二进制发布包位置:
distribution/target/apache-iotdb-0.10.0-SNAPSHOT-incubating-bin.zip

¡Bien, comencemos!

Lenguaje de definición de datos DDL

Documentos de referencia:

http://iotdb.apache.org/UserGuide/Master/Operation%20Manual/DDL%20Data%20Definition%20Language.html

Operaciones del grupo de almacenamiento

# 创建存储组
IoTDB> set storage group to root.turbine


# 查询存储组
IoTDB> SHOW STORAGE GROUP
+-------------+
|storage group|
+-------------+
| root.turbine|
+-------------+


# 删除存储组
IoTDB> delete storage group root.turbine

Crear series de tiempo

create timeseries root.turbine.d1.s1(temperature1) with datatype=FLOAT, encoding=GORILLA, compression=SNAPPY tags(unit=degree, owner=user1) attributes(description=mysensor1, location=BeiJing)
create timeseries root.turbine.d1.s2(temperature2) with datatype=FLOAT, encoding=GORILLA, compression=SNAPPY tags(unit=degree, owner=user1) attributes(description=mysensor2, location=TianJin)
create timeseries root.turbine.d2.s1(temperature1) with datatype=FLOAT, encoding=GORILLA, compression=SNAPPY tags(unit=degree, owner=user2) attributes(description=mysensor3, location=HeBei)

La visualización de secuencia registrada arriba es la imagen de abajo (dibujada a mano ... actualmente no hay función de visualización)

Para que sea más conveniente utilizarlo en aplicaciones prácticas, además de información básica como la ruta y el código de la serie temporal, hemos agregado tres conceptos de alias, etiqueta y atributo del punto de medición. El tamaño total de las etiquetas y los atributos se establece en el archivo de configuración tag_attribute_total_size.

Alias: El alias del punto de medición, que se puede utilizar para leer y escribir como el nombre del punto de medición, sin configuración.

Etiqueta: En la forma de clave = valor, los metadatos de la serie temporal se pueden consultar hacia atrás a través de la etiqueta, por ejemplo, la unidad y el propietario. La etiqueta residirá en la memoria. Actualmente, solo se puede dar una condición de consulta de etiqueta, que puede ser una consulta precisa y difusa.

Atributos: formato clave = valor, que solo puede mostrar información de atributos, como información de descripción y ubicación, de acuerdo con la ruta de la serie temporal. Si no hay necesidad de una consulta inversa, se recomienda definirla como un atributo.

# 插入更新 别名、标签、属性
ALTER timeseries root.turbine.d1.s1 UPSERT ALIAS=newAlias TAGS(unit=Degree, owner=me) ATTRIBUTES(description=ha, newAttr=v1)
# 删除时间序列
delete timeseries root.turbine.d2.s1

Consultar metadatos de secuencia según la ruta y la etiqueta

# 查询所有时间序列数据
IoTDB> show timeseries
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+
|        timeseries|       alias|storage group|dataType|encoding|compression|description|location|owner|  unit|
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+
|root.turbine.d1.s1|temperature1| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor1| BeiJing|user1|degree|
|root.turbine.d1.s2|temperature2| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor2| TianJin|user1|degree|
|root.turbine.d2.s1|temperature1| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor3|   HeBei|user2|degree|
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+


# 查询 root.turbine.d1 前缀路径下的时间序列 
# 根据 tag 精确查询 owner 为 user1 的序列
IoTDB> show timeseries root.turbine.d1
IoTDB> show timeseries root.turbine where owner=user1
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+
|        timeseries|       alias|storage group|dataType|encoding|compression|description|location|owner|  unit|
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+
|root.turbine.d1.s1|temperature1| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor1| BeiJing|user1|degree|
|root.turbine.d1.s2|temperature2| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor2| TianJin|user1|degree|
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+


# 根据 tag 模糊查询 owner 的 value 中包含 'user' 的序列
IoTDB> show timeseries where owner contains 'user'
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+
|        timeseries|       alias|storage group|dataType|encoding|compression|description|location|owner|  unit|
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+
|root.turbine.d1.s1|temperature1| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor1| BeiJing|user1|degree|
|root.turbine.d1.s2|temperature2| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor2| TianJin|user1|degree|
|root.turbine.d2.s1|temperature1| root.turbine|   FLOAT| GORILLA|     SNAPPY|  mysensor3|   HeBei|user2|degree|
+------------------+------------+-------------+--------+--------+-----------+-----------+--------+-----+------+

Ver los nodos secundarios de una ruta

IoTDB> show child paths root.turbine
+---------------+
|    child paths|
+---------------+
|root.turbine.d1|
|root.turbine.d2|
+---------------+


Cuente el número de series de tiempo

# 统计所有时间序列数量
IoTDB> count timeseries
+-----+
|count|
+-----+
|    3|
+-----+


# 分组统计时间序列,root 为第 0 层
IoTDB> count timeseries group by level=2
+---------------+-----+
|         column|count|
+---------------+-----+
|root.turbine.d1|    2|
|root.turbine.d2|    1|
+---------------+-----+

Consultar todos los dispositivos

Eso es para consultar la ruta del penúltimo nodo

IoTDB> show devices
+---------------+
|        devices|
+---------------+
|root.turbine.d1|
|root.turbine.d2|
+---------------+

Lenguaje de manipulación de datos DML

Documentos de referencia:

http://iotdb.apache.org/UserGuide/Master/Operation%20Manual/DML%20Data%20Manipulation%20Language.html

Escritura de datos

Los valores de un dispositivo, una marca de tiempo y varios puntos de medición se pueden escribir a la vez.

insert into root.turbine.d1(timestamp,s1,s2) values(1,1,2);
insert into root.turbine.d1(timestamp,s1,s2) values(2,1,2);
insert into root.turbine.d1(timestamp,s1,s2) values(3,1,2);
insert into root.turbine.d1(timestamp,s1,s2) values(4,1,2);
insert into root.turbine.d1(timestamp,s1,s2) values(5,1,2);
insert into root.turbine.d1(timestamp,s1,s2) values(6,1,2);
insert into root.turbine.d1(timestamp,s1,s2) values(10,1,2);

Borrado de datos

Actualmente, solo admite la eliminación de datos antes de un momento determinado, y luego admitirá la eliminación de datos durante cualquier período de tiempo.

delete from root.turbine.d2.s1 where time <= 10

Consulta de datos sin procesar

Luego vienen varias consultas, la más utilizada es la consulta de datos sin procesar.

IoTDB> select s1, s2 from root.turbine.d1
+-----------------------------+------------------+------------------+
|                         Time|root.turbine.d1.s1|root.turbine.d1.s2|
+-----------------------------+------------------+------------------+
|1970-01-01T08:00:00.001+08:00|               1.0|               2.0|
|1970-01-01T08:00:00.002+08:00|               1.0|               2.0|
|1970-01-01T08:00:00.003+08:00|               1.0|               2.0|
|1970-01-01T08:00:00.004+08:00|               1.0|               2.0|
|1970-01-01T08:00:00.005+08:00|               1.0|               2.0|
|1970-01-01T08:00:00.006+08:00|               1.0|               2.0|
|1970-01-01T08:00:00.010+08:00|               1.0|               2.0|
+-----------------------------+------------------+------------------+

Consulta de valor nulo de relleno de un solo punto

Muchas marcas de tiempo de los datos recopilados por el sensor tienen desviaciones, y es fácil encontrar los datos en una consulta de marca de tiempo precisa. Puede usar métodos anteriores o lineales para completar el valor en blanco

IoTDB> select s1 from root.turbine.d1 where time = 8
+----+------------------+
|Time|root.turbine.d1.s1|
+----+------------------+
+----+------------------+


# 用前边最近的值填过来
IoTDB> select s1 from root.turbine.d1 where time = 8 fill(float[previous])
+-----------------------------+------------------+
|                         Time|root.turbine.d1.s1|
+-----------------------------+------------------+
|1970-01-01T08:00:00.008+08:00|               1.0|
+-----------------------------+------------------+


# 如果想限制补值的范围,超过这个范围就不补了,可以再加个参数,要带单位
IoTDB> select s1 from root.turbine.d1 where time = 8 fill(float[previous,1ms])
+-----------------------------+------------------+
|                         Time|root.turbine.d1.s1|
+-----------------------------+------------------+
|1970-01-01T08:00:00.008+08:00|              null|
+-----------------------------+------------------+

Consulta de datos más reciente

Para visualizar los datos más recientes en tiempo real, hemos creado una función independiente de consulta de los últimos puntos de datos. Use la palabra clave select last como prefijo. La otra sintaxis es la misma que la de los datos originales y no se puede agregar filtrado de predicado.

IoTDB> select last * from root
+-----------------------------+------------------+-----+
|                         Time|        timeseries|value|
+-----------------------------+------------------+-----+
|1970-01-01T08:00:00.010+08:00|root.turbine.d1.s1|  1.0|
|1970-01-01T08:00:00.010+08:00|root.turbine.d1.s2|  2.0|
+-----------------------------+------------------+-----+

Consulta agregada

Para contar el valor agregado de una serie de tiempo, actualmente tratamos cada serie de tiempo como una secuencia independiente, y la agregación también se realiza en series. La próxima versión agregará la capacidad de agregar todas las secuencias en una ruta.

IoTDB> select count(*) from root where time <= 10
+-------------------------+-------------------------+-------------------------+
|count(root.turbine.d1.s1)|count(root.turbine.d1.s2)|count(root.turbine.d2.s1)|
+-------------------------+-------------------------+-------------------------+
|                        7|                        7|                        0|
+-------------------------+-------------------------+-------------------------+

0.10.0 Consulta de agregación de frecuencia reducida

La sintaxis de la agregación de frecuencia descendente 0.10 es diferente de 0.9. Primero, introduzca la versión 0.10.0 de la sintaxis de consulta de agregación de frecuencia descendente. Permítanme dar un ejemplo. Verifique el valor promedio de una secuencia de 9 a. M. A 12 a. M. En mayo de este año. El resultado debería ser similar a este:

1 de mayo, 9 en punto-12 en punto: valor agregado

2 de mayo de 9 a 12: valor agregado

...

31 de mayo, de las 9 a las 12: valor agregado

Para lograr esta consulta flexible, se requiere una ventana deslizante. La ventana comienza a las 9 en punto el 1 de mayo y la duración es de 3 horas. Cada vez que se desliza hacia adelante durante 24 horas y hasta el 31 de mayo, se calcula un promedio en cada ventana. valor.

Por lo tanto, diseñamos principalmente tres parámetros:

(1) El rango de inicio y finalización de la ventana deslizante, intervalo cerrado a la izquierda y abierto a la derecha: del 1 al 31 de mayo

(2) La duración de la ventana deslizante: 3 horas.

(3) Longitud del paso deslizante: 24 horas

La declaración es la siguiente (no escribí tantos datos, todo está vacío en este momento):

select avg(s1) from root.turbine.d1 group by([2020-05-01T09:00:00, 2020-05-31T12:00:00), 3h, 24h)

Da otro ejemplo más simple: consulta el promedio diario de mayo

En este ejemplo, la longitud de la ventana deslizante es igual a la longitud del paso deslizante, por lo que se puede omitir el tercer parámetro:

select avg(s1) from root.turbine.d1 group by([2020-05-01T00:00:00, 2020-06-01T00:00:00), 1d)

0.10.0 Valor de relleno de muestra

0.10.0 La nueva función de consulta, basada en el grupo por consulta, si usamos la función de agregación last_value, es una función de muestreo. Si no hay valor en un intervalo de tiempo determinado, también se puede usar el valor anterior para completar el espacio en blanco.

# 正常降采样,没数据的区间会填充 null
IoTDB> select last_value(s1) from root.turbine.d1 group by([1,10), 2ms)
+-----------------------------+------------------------------+
|                         Time|last_value(root.turbine.d1.s1)|
+-----------------------------+------------------------------+
|1970-01-01T08:00:00.001+08:00|                           1.0|
|1970-01-01T08:00:00.003+08:00|                           1.0|
|1970-01-01T08:00:00.005+08:00|                           1.0|
|1970-01-01T08:00:00.007+08:00|                          null|
|1970-01-01T08:00:00.009+08:00|                          null|
+-----------------------------+------------------------------+


# 降采样,如果某个区间没值,可以用前一个聚合值补空,填充函数为 previous
IoTDB> select last_value(s1) from root.turbine.d1 group by([1,10), 2ms) fill(float[previous])
+-----------------------------+------------------------------+
|                         Time|last_value(root.turbine.d1.s1)|
+-----------------------------+------------------------------+
|1970-01-01T08:00:00.001+08:00|                           1.0|
|1970-01-01T08:00:00.003+08:00|                           1.0|
|1970-01-01T08:00:00.005+08:00|                           1.0|
|1970-01-01T08:00:00.007+08:00|                           1.0|
|1970-01-01T08:00:00.009+08:00|                           1.0|
+-----------------------------+------------------------------+

Además, también admite otra forma de completar el valor en blanco, previousuntillast. Utilice el valor anterior para completar el espacio en blanco hasta que se complete el valor de tiempo del último punto. Por ejemplo, la marca de tiempo del último punto aquí es 10, 11 y 13 Ya no se agregará un punto.

IoTDB> select last_value(s1) from root.turbine.d1 group by((1,15], 2ms) fill(float[previousuntillast])
+-----------------------------+------------------------------+
|                         Time|last_value(root.turbine.d1.s1)|
+-----------------------------+------------------------------+
|1970-01-01T08:00:00.003+08:00|                           1.0|
|1970-01-01T08:00:00.005+08:00|                           1.0|
|1970-01-01T08:00:00.007+08:00|                           1.0|
|1970-01-01T08:00:00.009+08:00|                           1.0|
|1970-01-01T08:00:00.011+08:00|                           1.0|
|1970-01-01T08:00:00.013+08:00|                          null|
|1970-01-01T08:00:00.015+08:00|                          null|
+-----------------------------+------------------------------+

No sé si ha notado que el intervalo de esta oración se abre antes y se cierra, y el conjunto de resultados también es el punto de tiempo del intervalo cerrado. De esta forma, la consulta de muestreo y llenado de valores nulos se realiza a través de la instrucción group by fill.

Consulta de agregación de frecuencia descendente 0.9.x

La sintaxis de agregación de frecuencia descendente de la versión anterior 0.9 es diferente de la de 0.10. Hay varios parámetros

(1) Intervalo de segmento, divida el eje de tiempo en segmentos de acuerdo con esta longitud

(2) El origen de la división, desde el que se inicia la división, se puede utilizar el punto final de cualquier segmento. El valor predeterminado es 1 de enero de 1970, 0:00:00, 0:00:00 como origen de corte, que es el 0 de la marca de tiempo.

(3) El rango de visualización del conjunto de resultados

Una vez fijados los dos primeros parámetros, se determina el segmento del eje de tiempo y el tercer parámetro especifica el conjunto de resultados.

Por ejemplo, consulte el promedio diario de mayo

select avg(s1) from root.turbine.d1 group by (1d, 2020-05-01 00:00:00, [2020-05-01 00:00:00, 2020-05-31 23:59:59]);

Alinear consulta por dispositivo

A través del ejemplo anterior, podemos ver que la estructura de la tabla predeterminada de la consulta de IoTDB es [tiempo, secuencia 1, secuencia 2, ..., secuencia n], todas las secuencias se alinearán según el tiempo, si hay una secuencia que no existe en un momento determinado. Existirá, llenará el valor en blanco Al hacer el filtrado de valores, el filtrado de esta estructura de tabla será muy estricto.

Para evitar que cada dispositivo interfiera entre sí durante la consulta, admitimos la alineación de la consulta por hora y dispositivo. La estructura de la tabla es [hora, ID del dispositivo, punto de medición 1, punto de medición 2, ..., punto de medición n]. Esta es la relación La estructura de la tabla es similar, solo agregue alinear por dispositivo después de la declaración de consulta 

IoTDB> select * from root align by device
+-----------------------------+---------------+---+---+
|                         Time|         Device| s1| s2|
+-----------------------------+---------------+---+---+
|1970-01-01T08:00:00.001+08:00|root.turbine.d1|1.0|2.0|
|1970-01-01T08:00:00.002+08:00|root.turbine.d1|1.0|2.0|
|1970-01-01T08:00:00.003+08:00|root.turbine.d1|1.0|2.0|
|1970-01-01T08:00:00.004+08:00|root.turbine.d1|1.0|2.0|
|1970-01-01T08:00:00.005+08:00|root.turbine.d1|1.0|2.0|
|1970-01-01T08:00:00.006+08:00|root.turbine.d1|1.0|2.0|
|1970-01-01T08:00:00.010+08:00|root.turbine.d1|1.0|2.0|
+-----------------------------+---------------+---+---+

para resumir

Las operaciones básicas de hoy se presentarán primero. Para la sintaxis específica de sql, consulte el sitio web oficial. El sql de este artículo se puede pegar en la CLI y divertirse solo ~ ¡Feliz fin de semana a todos!

¡Bienvenido a mirar! ¡Apreciar! ¡Adelante!

Supongo que te gusta

Origin blog.csdn.net/qiaojialin/article/details/106596017
Recomendado
Clasificación