时序时空数据库TSDB

    对接hive-sql

    Tsdb storage handler

    TSDB对接hive是通过实现一个TSDB的HiveStorageHandler,支持对tsdb数据的读取。

    Jar下载地址:http://tsdb-bos.gz.bcebos.com/hive-tsdb-handler-all.jar

    如果是本地hive集群,请下载jar到本地;如果使用bmr,则上传到bos或者直接使用地址bos://iot-tsdb/hive-tsdb-handler-all.jar

    支持的hive 1.2.0,jdk 1.7。

    在Hive CLI或Hue中使用

    示例及参数说明如下:

    add jar /path/to/hive-tsdb-handler-all.jar;    /* 添加jar,如果在bmr中,请使用bos地址,如bos://path/to/hive-tsdb-handler-all.jar */ 
    CREATE EXTERNAL TABLE `wind`(`time` bigint, `value` double, `city` string)     /* 创建表 */
    STORED BY 'com.baidubce.tsdb.hive.storage.TsdbStorageHandler'                  /* 设置storage为TsdbStorageHandler */
    TBLPROPERTIES (
    "tsdb.metric_name" = "wind",                                                   /* Metric名字,默认表名则被当为metric */
    "tsdb.timestamp_name" = "time",                                                /* Timestamp对应的列名,默认time为对应的列名 */
    "tsdb.field_names" = "value",                                                  /* field列表,只需填写table中用到的,多个field通过逗号分割 */
    "tsdb.tag_keys" = "city",                                                      /* tagKey列表,只需填写table中用到的,这个示例中可以去掉改行,但如果tagKey中包含大写字母,则必须填写 */
    "tsdb.endpoint" = "ENDPOINT",                                                  /* TSDB实例的endpoint */
    "tsdb.access_key" = "AK",                                                      /* AK */
    "tsdb.secret_key" = "SK"                                                       /* SK */
    );
     
    select time, value from wind where time>=1451500000000 and time<=1451577600000;

    场景示例

    计算风速

    风速数据由传感器定时上传到tsdb中,数据包含两个field分别为x和y,表示x轴和y轴方向的风速,如下由两个垂直方向的风速来计算出总的风速。

    add jar /path/to/hive-tsdb-handler-all.jar;    /* 添加jar,如果在bmr中,请使用bos地址,如bos://path/to/hive-tsdb-handler-all.jar */ 
    CREATE EXTERNAL TABLE `WindSpeed`(`time` bigint, `x` double, `y` double)       /* 创建表 */
    STORED BY 'com.baidubce.tsdb.hive.storage.TsdbStorageHandler'                  /* 设置storage为TsdbStorageHandler */
    TBLPROPERTIES (
    "tsdb.metric_name" = "WindSpeed",                                              /* Metric名字,默认表名则被当为metric */
    "tsdb.timestamp_name" = "time",                                                /* Timestamp对应的列名,默认time为对应的列名 */
    "tsdb.field_names" = "x,y",                                                    /* field列表,多个field通过逗号分割 */
    "tsdb.endpoint" = "ENDPOINT",                                                  /* TSDB实例的endpoint */
    "tsdb.access_key" = "AK",                                                      /* AK */
    "tsdb.secret_key" = "SK"                                                       /* SK */
    );
     
    select time, sqrt(pow(x, 2) + pow(y, 2)) as speed from WindSpeed;

    原始数据

    metric:WindSpeed

    time field : x field : y
    1512086400000 3.0 4.0
    1512086410000 1.0 2.0
    1512086420000 2.0 3.0

    结果

    time speed
    1512086400000 5.000
    1512086410000 2.236
    1512086420000 3.606

    计算车辆在时间上的使用情况

    车辆在行驶过程中会定时(每10秒)将数据上传到tsdb中,数据中包含车速speed。需要统计三种时长:

    (1)停止时长:一段时间内这台车子有上报数据,但是上报的车速显示是0,可能是车子在等红灯。

    (2)运行时长:一段时间内这台车子有上报数据,且上报的车速显示大于0,这台车子正在行驶中。

    (3)离线时长:一段时间内这台车子没有上报数据的时长,这台车子已经停下并熄火了。

    add jar /path/to/hive-tsdb-handler-all.jar;    /* 添加jar,如果在bmr中,请使用bos地址,如bos://path/to/hive-tsdb-handler-all.jar */ 
    CREATE EXTERNAL TABLE `vehicle`(`time` bigint, `speed` bigint, `carId` string) /* 创建表 */
    STORED BY 'com.baidubce.tsdb.hive.storage.TsdbStorageHandler'                  /* 设置storage为TsdbStorageHandler */
    TBLPROPERTIES (
    "tsdb.metric_name" = "vehicle",                                                /* Metric名字,默认表名则被当为metric */
    "tsdb.timestamp_name" = "time",                                                /* Timestamp对应的列名,默认time为对应的列名 */
    "tsdb.field_names" = "speed",                                                  /* field列表,多个field通过逗号分割 */
    "tsdb.tag_keys" = "carId",                                                     /* tag列表,多个tag通过逗号分割 */
    "tsdb.endpoint" = "ENDPOINT",                                                  /* TSDB实例的endpoint */
    "tsdb.access_key" = "AK",                                                      /* AK */
    "tsdb.secret_key" = "SK"                                                       /* SK */
    );
     
    /* ID为“123”的车辆在2017年12月每天的停止时长 */
    select floor((time - 1512057600000) / 86400000) + 1 as day, count(*) * 10 as stop_seconds from vehicle where carId='123' and time >= 1512057600000 and time < 1514736000000 and speed = 0 group by floor((time - 1512057600000) / 86400000);
     
    /* ID为“123”的车辆在2017年12月每天的运行时长 */
    select floor((time - 1512057600000) / 86400000) + 1 as day, count(*) * 10 as run_seconds from vehicle where carId='123' and time >= 1512057600000 and time < 1514736000000 and speed > 0 group by floor((time - 1512057600000) / 86400000);
     
    /* ID为“123”的车辆在2017年12月每天的运行时长 */
    select floor((time - 1512057600000) / 86400000) + 1 as day, 2678400 - count(*) * 10 as offline_seconds from vehicle where carId='123' and time >= 1512057600000 and time < 1514736000000 group by floor((time - 1512057600000) / 86400000);

    原始数据

    metric:vehicle

    time field : speed tag
    1512086400000 40 carId=123
    1512086410000 60 carId=123
    1512086420000 50 carId=123
    ... ... carId=123
    1512086460000 10 carId=123

    结果

    day stop_seconds
    1 3612
    2 3401
    ... ...
    31 3013
    day run_seconds
    1 17976
    2 17968
    ... ...
    31 17377
    day offline_seconds
    1 64812
    2 65031
    ... ...
    31 66010
    上一篇
    支持SQL查询
    下一篇
    对接spark-sql