Druid 大数据分析之查询

大数据分析篇之Druid 一. 简介 列式分布式,支持实时分析,PB级数据,毫秒级查询,数据实时处理 预计算预聚合 bitmap压缩算法 必须具备时间字段 1. 特点 2. 应用场景 多读写少 实时性要求高 数据质量不敏感 二. 核心 1. Druid 与Impala,Kylin,Presto,Impala,Spark SQL,ES的对比 2. 大数据分析框架选型 3. Druid架构原理 4. Nodes MiddleManager Nodes Historical Nodes Coordinator Nodes Overlo 阅读详情

Druid 大数据分析之查询

druid 

1、Druid 查询概述

    上一节完成数据导入后,接下来讲讲Druid如何查询及统计分析导入的数据。
    Druid的查询是使用REST风格的HTTP请求查询服务节点(Broker、Historical、Realtime),这些服务节点暴露REST查询接口,客户端发送Json对象请求查询接口。一般情况下,查询服务接口发布在Broker节点,基于Linux 的POST请求查询如下所示: 

Java代码 

 收藏代码

  1. /** 
  2. * port: 查询请求接口对应Broker,默认8082端口 
  3. * query_json_file: 查询Json对象文件(配置) 
  4. */  
  5. curl -X POST '<queryable_host>:<port>/druid/v2/?pretty' -H 'Content-Type:application/json' -d @<query_json_file>  

 

2、Druid 查询类型

     Druid在不同场景下,有很多的查询类型。查询是由各种JSON属性和Druid有不同类型的不同场景下查询组成。对于各种类型的查询类型的配置可以json属性文件设置。Druid查询类型,概括一下为3大类:
     1. 聚合查询 - 时间序列查询(Timeseries)、排名查询(TopN)、分组查询(GroupBy)
     2. 元数据查询 - 时间范围(Time Boundary) 、段元数据(Segment Metadata)、数据源(Datasource)
     3. Search查询 - Search
     本节以聚合查询为主,其它查询类型比较简单,使用上相对比较少,暂不介绍。对聚合查询类型下的3种查询如何选择进行一下概述:
     在可能的情况下,我们建议使用的时间序列和TopN查询代替分组查询,分组查询是Druid最灵活的的查询,但是性能最差。时间序列查询是明显快于GROUPBY查询,因为聚合不需要分组尺寸。对于分组和排序在一个单一的维度,TopN查询更优于GROUPBY。

 

2.1 Json查询属性

在讲聚合查询下的3种查询类型之前,我们需要对3种查询类型共有的特别重要的Json属性理解与熟悉,常用属性如:queryType、dataSource、granularity、filter、aggregator等。

 

2.1.1 查询类型(queryType)

对应聚合查询下的3种类型值:timeseries、topN、groupBy

 

2.1.2 数据源(dataSource)

数据源,类似数据库中表的概念,对应数据导入时Json配置属性dataSource值

 

2.1.3 聚合粒度(granularity)

    粒度决定如何得到数据块在跨时间维度,或者如何得到按小时,天,分钟的汇总等。在配置查询聚合粒度里有三种配置方法:
    1. 简单聚合粒度 - 支持字符串值有:all、none、second、minute、fifteen_minute、thirty_minute、hour、day、week、month、quarter、year
       (1) all - 将所有块变成一块
       (2) none - 不使用块数据(它实际上是使用最小索引的粒度,none意味着为毫秒级的粒度);按时间序列化查询时不建议使用none,因为所有的毫秒不存在,系统也将尝试生成0值,这往往是很多。
    2. 时间段聚合粒度 - Druid指定一精确的持续时间(毫秒)和时间缀返回UTC(世界标准时间)。
    3. 常用时间段聚合粒度 - 与时间段聚合粒度差不多,但是常用时间指平时我们常用时间段,如年、月、周、小时等。
    下面对3种聚合粒度配置举例说明:

  

    简单聚合粒度

        查询粒度比数据采集时配置的粒度小,则不合理,也无意义,因较小粒度(相比)者无索引数据;如
    查询粒度小于采集时配置的查询粒度时,则Druid的查询结果与采集数据配置的查询粒度结果一样。

        假设我们存储在Druid的数据使用毫秒粒度获取,数据如下:

Java代码 

 收藏代码

  1. {"timestamp": "2013-08-31T01:02:33Z", "page": "AAA", "language" : "en"}  
  2. {"timestamp": "2013-09-01T01:02:33Z", "page": "BBB", "language" : "en"}  
  3. {"timestamp": "2013-09-02T23:32:45Z", "page": "CCC", "language" : "en"}  
  4. {"timestamp": "2013-09-03T03:32:45Z", "page": "DDD", "language" : "en"}  

       以"小时" 粒度提交一个groupby查询,查询配置如下:

Java代码 

 收藏代码

  1. {  
  2.    "queryType":"groupBy",  
  3.    "dataSource":"dataSource",  
  4.    "granularity":"hour",  
  5.    "dimensions":[  
  6.       "language"  
  7.    ],  
  8.    "aggregations":[  
  9.       {  
  10.          "type":"count",  
  11.          "name":"count"  
  12.       }  
  13.    ],  
  14.    "intervals":[  
  15.       "2000-01-01T00:00Z/3000-01-01T00:00Z"  
  16.    ]  
  17. }  

      按小时粒度进行的groupby查询结果中timestamp值精确到小时间,比小时粒度更小粒度值自动补填零,

以此类推按天查询,则小时及小粒度补零。timestamp值为UTC

Java代码 

 收藏代码

  1. [ {  
  2.   "version" : "v1",  
  3.   "timestamp" : "2013-08-31T01:00:00.000Z",  
  4.   "event" : {  
  5.     "count" : 1,  
  6.     "language" : "en"  
  7.   }  
  8. }, {  
  9.   "version" : "v1",  
  10.   "timestamp" : "2013-09-01T01:00:00.000Z",  
  11.   "event" : {  
  12.     "count" : 1,  
  13.     "language" : "en"  
  14.   }  
  15. }, {  
  16.   "version" : "v1",  
  17.   "timestamp" : "2013-09-02T23:00:00.000Z",  
  18.   "event" : {  
  19.     "count" : 1,  
  20.     "language" : "en"  
  21.   }  
  22. }, {  
  23.   "version" : "v1",  
  24.   "timestamp" : "2013-09-03T03:00:00.000Z",  
  25.   "event" : {  
  26.     "count" : 1,  
  27.     "language" : "en"  
  28.   }  
  29. } ]  

       如果指定查询粒度为 none,则返回结果与数据导入时设置粒度(queryGranularity属性值)结果一样,
    此处的导入粒度为毫秒,结果如下:

Java代码 

 收藏代码

  1. [ {  
  2.   "version" : "v1",  
  3.   "timestamp" : "2013-08-31T01:02:33.000Z",  
  4.   "event" : {  
  5.     "count" : 1,  
  6.     "language" : "en"  
  7.   }  
  8. }, {  
  9.   "version" : "v1",  
  10.   "timestamp" : "2013-09-01T01:02:33.000Z",  
  11.   "event" : {  
  12.     "count" : 1,  
  13.     "language" : "en"  
  14.   }  
  15. }, {  
  16.   "version" : "v1",  
  17.   "timestamp" : "2013-09-02T23:32:45.000Z",  
  18.   "event" : {  
  19.     "count" : 1,  
  20.     "language" : "en"  
  21.   }  
  22. }, {  
  23.   "version" : "v1",  
  24.   "timestamp" : "2013-09-03T03:32:45.000Z",  
  25.   "event" : {  
  26.     "count" : 1,  
  27.     "language" : "en"  
  28.   }  
  29. } ]  

     如果指定查询粒度为 all,返回数组长度结果为1,结果如下:

Java代码 

 收藏代码

  1. [ {  
  2.   "version" : "v1",  
  3.   "timestamp" : "2000-01-01T00:00:00.000Z",  
  4.   "event" : {  
  5.     "count" : 4,  
  6.     "language" : "en"  
  7.   }  
  8. } ]  

 

    时间段聚合粒度 

          指定一个精确时间持续时长(毫秒表示)及时间缀,返回UTC时间;支持可选项属性origin,不指定时 
     默认开始时间(1970-01-01T00:00:00Z)

 

Java代码 

 收藏代码

  1. /**持续时间段2小时,从1970-01-01T00:00:00Z开始*/  
  2. {"type": "duration", "duration": 7200000}  

Java代码 

 收藏代码

  1. /**持续时间1小时,从origin开始*/  
  2. {"type": "duration", "duration": 3600000, "origin": "2012-01-01T00:30:00Z"}  

       

    以上简单聚合粒度的示例数据为例,提交groupby查询,持续时间段为24小时,查询配置如下:

 

Java代码 

 收藏代码

  1. {  
  2.    "queryType":"groupBy",  
  3.    "dataSource":"dataSource",  
  4.    "granularity":{"type": "duration", "duration": "86400000"},  
  5.    "dimensions":[  
  6.       "language"  
  7.    ],  
  8.    "aggregations":[  
  9.       {  
  10.          "type":"count",  
  11.          "name":"count"  
  12.       }  
  13.    ],  
  14.    "intervals":[  
  15.       "2000-01-01T00:00Z/3000-01-01T00:00Z"  
  16.    ]  
  17. }  

     查询结果:

Java代码 

 收藏代码

  1. [ {  
  2.   "version" : "v1",  
  3.   "timestamp" : "2013-08-31T00:00:00.000Z",  
  4.   "event" : {  
  5.     "count" : 1,  
  6.     "language" : "en"  
  7.   }  
  8. }, {  
  9.   "version" : "v1",  
  10.   "timestamp" : "2013-09-01T00:00:00.000Z",  
  11.   "event" : {  
  12.     "count" : 1,  
  13.     "language" : "en"  
  14.   }  
  15. }, {  
  16.   "version" : "v1",  
  17.   "timestamp" : "2013-09-02T00:00:00.000Z",  
  18.   "event" : {  
  19.     "count" : 1,  
  20.     "language" : "en"  
  21.   }  
  22. }, {  
  23.   "version" : "v1",  
  24.   "timestamp" : "2013-09-03T00:00:00.000Z",  
  25.   "event" : {  
  26.     "count" : 1,  
  27.     "language" : "en"  
  28.   }  
  29. } ]  

    

    常用时间段聚合粒度

 

         略...

 

 

2.1.4 过滤(Filters)

一个Filter就是一个Json对象,用于过滤数据行过滤,类似SQL中的Where子句。过滤器类型有如下:Selector filte、Regular expression filter(正则表达式过滤)、Logical expression filters(AND、OR、NOT)、In filter、Bound filter、Search filter、JavaScript filter、Extraction filter

    示例简单查看使用方式:

   

   查询过滤(Selector filte)

           等价于:WHERE <dimension_string> = '<dimension_value_string>'

Java代码 

 收藏代码

  1. "filter": { "type": "selector", "dimension": <dimension_string>, "value": <dimension_value_string> }  

   

    正则表达过滤(Regular expression filter)

           与Selector filte差不多,只是这里使用正则表达式,表达式为标准的Java正则表达式规范

 

Java代码 

 收藏代码

  1. "filter": { "type": "regex", "dimension": <dimension_string>, "pattern": <pattern_string> }  

 

    逻缉表达过滤(Logical expression filters)

   

     AND

 

Java代码 

 收藏代码

  1. "filter": { "type": "and", "fields": [<filter>, <filter>, ...] }  

 

     OR

 

Java代码 

 收藏代码

  1. "filter": { "type": "or", "fields": [<filter>, <filter>, ...] }  

 

     NOT

 

Java代码 

 收藏代码

  1. "filter": { "type": "not", "field": <filter> }  

 

 

    IN过滤(In filter)

       

    SQL查询

 

Java代码 

 收藏代码

  1. SELECT COUNT(*) AS 'Count' FROM `table` WHERE `outlaw` IN ('Good', 'Bad', 'Ugly')  

    Druid IN 过滤表示

 

Java代码 

 收藏代码

  1. {  
  2.     "type": "in",  
  3.     "dimension": "outlaw",  
  4.     "values": ["Good", "Bad", "Ugly"]  
  5. }  

 

    范围过滤(Bound filter)

         Bound filter 过滤比较值大小或小于某值,默认按字符串比较,使用数据比较需要设置alphaNumeric 属
     性为true;默认 Bound filter为非严格性(类闭区间),如 inputString <= upper && inputSting >= lower

 

Java代码 

 收藏代码

  1. {  
  2.     "type": "bound",  
  3.     "dimension": "age",  
  4.     "lower": "21",  
  5.     "upper": "31" ,  
  6.     "alphaNumeric": true  
  7. }  

    上述表示等价如:21 <= age <= 31

 

    Bound filter 严格性,需要设置lowerStrict or/and upperStrict 属性值为true如下:

 

Java代码 

 收藏代码

  1. {  
  2.     "type": "bound",  
  3.     "dimension": "age",  
  4.     "lower": "21",  
  5.     "lowerStrict": true,  
  6.     "upper": "31" ,  
  7.     "upperStrict": true,  
  8.     "alphaNumeric": true  
  9. }  

    等价如:21 < age < 31

 

2.1.5 聚合(Aggregations)

   聚合可以在采集时间时规格部分的一种方式,汇总数据进入Druid之前提供。聚合也可以被指定为在查询时多查询的部分,聚合类型如下:Count aggregator、Sum aggregators、Min / Max aggregators、Approximate Aggregations、Miscellaneous Aggregations 

 

    Count aggregator

          

        查询返回匹配过滤条件的数据行数,需要注意的是:Druid进行Count查询的数据量并不一定等于数据采
    集时导入的数据量,因为Druid在采集数据并导入时已经对数据进行了聚合。

 

Java代码 

 收藏代码

  1. { "type" : "count", "name" : <output_name> }  

 

    Sum aggregator

 

          longSum aggregator:计算值为有符号位64位整数

          

Java代码 

 收藏代码

  1. { "type" : "longSum", "name" : <output_name>, "fieldName" : <metric_name> }  

   

          doubleSum aggregator:与longSum类似,计算值为64位浮点型 

 

Java代码 

 收藏代码

  1. { "type" : "doubleSum", "name" : <output_name>, "fieldName" : <metric_name> }  

 

    Min / Max aggregators

 

          doubleMin aggregator 

 

Java代码 

 收藏代码

  1. { "type" : "doubleMin", "name" : <output_name>, "fieldName" : <metric_name> }  

    

          doubleMax aggregator

 

Java代码 

 收藏代码

  1. { "type" : "doubleMax", "name" : <output_name>, "fieldName" : <metric_name> }  

 

          longMin aggregator

 

Java代码 

 收藏代码

  1. { "type" : "longMin", "name" : <output_name>, "fieldName" : <metric_name> }  

 

         longMax aggregator

 

Java代码 

 收藏代码

  1. { "type" : "longMax", "name" : <output_name>, "fieldName" : <metric_name> }  

 

    类似聚合(Approximate Aggregations)

         

        基数聚合(Cardinality aggregator)

  

         计算Druid多种维度基数,Cardinality aggregator使用HyperLogLog评估基数,这种聚合比带有索引的
     hyperUnique聚合慢,运行在一个维度列,意味着不能从数据集中删除字符串维度来提高聚合;一般我们
     强力推荐使用hyperUnique aggregator而不是Cardinality aggregator,格式如下:

 

Java代码 

 收藏代码

  1. {  
  2.   "type": "cardinality",  
  3.   "name": "<output_name>",  
  4.   "fieldNames": [ <dimension1>, <dimension2>, ... ],  
  5.   "byRow": <false | true> # (optional, defaults to false)  
  6. }  

 

       . 维度值聚合-当设置属性byRow为false(默认值)时,通过合并所有给定的维度列来计算值集合。

         

         对于单维度,等价如下:

 

Java代码 

 收藏代码

  1. SELECT COUNT(DISTINCT(dimension)) FROM <datasource>  

        

         对于多维度,等价如下:

 

Java代码 

 收藏代码

  1. SELECT COUNT(DISTINCT(value)) FROM (  
  2.   SELECT dim_1 as value FROM <datasource>  
  3.   UNION  
  4.   SELECT dim_2 as value FROM <datasource>  
  5.   UNION  
  6.   SELECT dim_3 as value FROM <datasource>  
  7. )  

 

       . 行聚合-当设置属性byRow为true时,根所不同维度的值合并来计算行值,等价如下:

 

Java代码 

 收藏代码

  1. SELECT COUNT(*) FROM ( SELECT DIM1, DIM2, DIM3 FROM <datasource> GROUP BY DIM1, DIM2, DIM3 )  

 

 

           许多不同国家的人出生地或来自哪里,用druid配置如下:

 

Java代码 

 收藏代码

  1. {  
  2.   "type": "cardinality",  
  3.   "name": "distinct_countries",  
  4.   "fieldNames": [ "coutry_of_origin", "country_of_residence" ]  
  5. }  

 

 

        HyperUnique aggregator

 

        已经被“hyperunique”在创建索引时聚合的维度值使用HyperLogLog计算估计,更多资料请参考官网

 

Java代码 

 收藏代码

  1. { "type" : "hyperUnique", "name" : <output_name>, "fieldName" : <metric_name> }  

  

后聚合(post-aggregators)

后聚合是对Druid进行聚合后的值进行聚全,如果查询中包括一个后聚合,那么确保所有聚合满足后聚合要求;后聚合有以下几种类型:
1. Arithmetic post-aggregators
2. Field accessor post-aggregator
3. Constant post-aggregator
4. JavaScript post-aggregator
5. HyperUnique Cardinality post-aggregator

     

         Arithmetic post-aggregators

 

           算术后聚合应用已提供的函数从左到右获取字段,这些字段可聚合或后聚合;支持+, -, *, /, and quotient。

           算术后聚合可以指定ordering属性,用于聚合结果排序(对topN查询很有用 ):

               (1) 如果无ordering属性(或null),使用默认的浮点排序。

               (2) numericFirst 首先返回有限值,其次是NaN,最后返回无限值。

           算术后聚合语法如下:

 

Java代码 

 收藏代码

  1. postAggregation : {  
  2.   "type"  : "arithmetic",  
  3.   "name"  : <output_name>,  
  4.   "fn"    : <arithmetic_function>,  
  5.   "fields": [<post_aggregator>, <post_aggregator>, ...],  
  6.   "ordering" : <null (default), or "numericFirst">  
  7. }  

 

 

        Field accessor post-aggregator - fieldName引用aggregator定义的名称

 

Java代码 

 收藏代码

  1. { "type" : "fieldAccess", "name": <output_name>, "fieldName" : <aggregator_name> }  

 

        Constant post-aggregator - 返回指定值

 

Java代码 

 收藏代码

  1. { "type"  : "constant", "name"  : <output_name>, "value" : <numerical_value> }  

 

 

2.2 时间序列查询(Timeseries)

      这些类型的查询以时间序列查询对象和返回一个JSON数组对象,每个对象表示时间序列查询的值,时间序列查询请求的Json的7个主要属性如下:

属性描述必填项
queryType字符串类型,时间序列 "timeseries"   是
dataSource字符串类型,数据源(类似数据库表)   是
descending排序标志,默认为 "false"(升序)   否
intervals查询时间范围跨度,JSON对象,ISO-8601区间   是
granularity定义查询结果块粒度   是
filter过滤条件   否
aggregations聚合   是
postAggregations后聚合   否
context上下文   否

 

引用官网序列化查询json配置代码 

 收藏代码

  1. {  
  2.   "queryType": "timeseries",  
  3.   "dataSource": "sample_datasource",  
  4.   "granularity": "day",  
  5.   "descending": "true",  
  6.   "filter": {  
  7.     "type": "and",  
  8.     "fields": [  
  9.       { "type": "selector", "dimension": "sample_dimension1", "value": "sample_value1" },  
  10.       { "type": "or",  
  11.         "fields": [  
  12.           { "type": "selector", "dimension": "sample_dimension2", "value": "sample_value2" },  
  13.           { "type": "selector", "dimension": "sample_dimension3", "value": "sample_value3" }  
  14.         ]  
  15.       }  
  16.     ]  
  17.   },  
  18.   "aggregations": [  
  19.     { "type": "longSum", "name": "sample_name1", "fieldName": "sample_fieldName1" },  
  20.     { "type": "doubleSum", "name": "sample_name2", "fieldName": "sample_fieldName2" }  
  21.   ],  
  22.   "postAggregations": [  
  23.     { "type": "arithmetic",  
  24.       "name": "sample_divide",  
  25.       "fn": "/",  
  26.       "fields": [  
  27.         { "type": "fieldAccess", "name": "postAgg__sample_name1", "fieldName": "sample_name1" },  
  28.         { "type": "fieldAccess", "name": "postAgg__sample_name2", "fieldName": "sample_name2" }  
  29.       ]  
  30.     }  
  31.   ],  
  32.   "intervals": [ "2012-01-01T00:00:00.000/2012-01-03T00:00:00.000" ]  
  33. }  

   

 

    上述配置了过滤条件,2个聚合,后聚合器将2个聚合结果进行相除。查询结果如下,查询结果存储在属性result,以键值对方式存储:

 

Java代码 

 收藏代码

  1. [  
  2.   {  
  3.     "timestamp": "2012-01-01T00:00:00.000Z",  
  4.     "result": { "sample_name1": <some_value>, "sample_name2": <some_value>, "sample_divide": <some_value> }   
  5.   },  
  6.   {  
  7.     "timestamp": "2012-01-02T00:00:00.000Z",  
  8.     "result": { "sample_name1": <some_value>, "sample_name2": <some_value>, "sample_divide": <some_value> }  
  9.   }  
  10. ]  

  

2.3 排名查询(TopN query)

    TopN查询根据规范返回给定维度的有序的结果集,从概念上来讲,TopN查询被认为单维度、有序的类似分组查询。在某些情况下,TopN查询比分组查询(groupby query)快。TopN查询结果返回Json数组对象。
    TopN在每个节点将顶上K个结果排名,在Druid默认情况下最大值为1000。在实践中,如果你要求前1000个项顺序排名,那么从第1-999个项的顺序正确性是100%,其后项的结果顺序没有保证。你可以通过增加threshold值来保证顺序准确。

属性描述必填项
queryType字符串类型,时间序列 "topN"   是
dataSource字符串类型,数据源(类似数据库表)   是
intervals查询时间范围跨度,JSON对象,ISO-8601区间   是
granularity定义查询结果块粒度   是
filter过滤条件   否
aggregations聚合   是
postAggregations后聚合   否
dimension查询的维度(列)   是
threshold返回Top N个结果   是
metric字符串或Json对象指定度量对Top N个结果排序   是
context上下文   否
 

  

Metric

属性描述必填项
type数字排序   是
metric排序字段   是
 

  

       数据排序(Numeric TopNMetricSpec) - 最简单的规范指定一个字符串值指示排序TopN结果的度量

 

Java代码 

 收藏代码

  1. "metric": "<metric_name>"  

  

       metric属性通常配置为Json对象,上述等价于:

 

Java代码 

 收藏代码

  1. "metric": {  
  2.     "type": "numeric",  
  3.     "metric": "<metric_name>"  
  4. }  

 

    topN query 配置示例如下:

 

Java代码 

 收藏代码

  1. {  
  2.   "queryType": "topN",  
  3.   "dataSource": "sample_data",  
  4.   "dimension": "sample_dim",  
  5.   "threshold": 5,  
  6.   "metric": "count",  
  7.   "granularity": "all",  
  8.   "filter": {  
  9.     "type": "and",  
  10.     "fields": [  
  11.       {  
  12.         "type": "selector",  
  13.         "dimension": "dim1",  
  14.         "value": "some_value"  
  15.       },  
  16.       {  
  17.         "type": "selector",  
  18.         "dimension": "dim2",  
  19.         "value": "some_other_val"  
  20.       }  
  21.     ]  
  22.   },  
  23.   "aggregations": [  
  24.     {  
  25.       "type": "longSum",  
  26.       "name": "count",  
  27.       "fieldName": "count"  
  28.     },  
  29.     {  
  30.       "type": "doubleSum",  
  31.       "name": "some_metric",  
  32.       "fieldName": "some_metric"  
  33.     }  
  34.   ],  
  35.   "postAggregations": [  
  36.     {  
  37.       "type": "arithmetic",  
  38.       "name": "sample_divide",  
  39.       "fn": "/",  
  40.       "fields": [  
  41.         {  
  42.           "type": "fieldAccess",  
  43.           "name": "some_metric",  
  44.           "fieldName": "some_metric"  
  45.         },  
  46.         {  
  47.           "type": "fieldAccess",  
  48.           "name": "count",  
  49.           "fieldName": "count"  
  50.         }  
  51.       ]  
  52.     }  
  53.   ],  
  54.   "intervals": [  
  55.     "2013-08-31T00:00:00.000/2013-09-03T00:00:00.000"  
  56.   ]  
  57. }  

   

    查询前Top 5个结果,按count排序:

 

Java代码 

 收藏代码

  1. [  
  2.   {  
  3.     "timestamp": "2013-08-31T00:00:00.000Z",  
  4.     "result": [  
  5.       {  
  6.         "dim1": "dim1_val",  
  7.         "count": 111,  
  8.         "some_metrics": 10669,  
  9.         "average": 96.11711711711712  
  10.       },  
  11.       {  
  12.         "dim1": "another_dim1_val",  
  13.         "count": 88,  
  14.         "some_metrics": 28344,  
  15.         "average": 322.09090909090907  
  16.       },  
  17.       {  
  18.         "dim1": "dim1_val3",  
  19.         "count": 70,  
  20.         "some_metrics": 871,  
  21.         "average": 12.442857142857143  
  22.       },  
  23.       {  
  24.         "dim1": "dim1_val4",  
  25.         "count": 62,  
  26.         "some_metrics": 815,  
  27.         "average": 13.14516129032258  
  28.       },  
  29.       {  
  30.         "dim1": "dim1_val5",  
  31.         "count": 60,  
  32.         "some_metrics": 2787,  
  33.         "average": 46.45  
  34.       }  
  35.     ]  
  36.   }  
  37. ]  

 

 

FPGA AXI DDR3读写时序调试与FIFO缓存实战解析 本文深入解析FPGA中AXI协议与DDR3的读写时序调试,重点探讨FIFO缓存在数据流控制中的关键作用。通过实战案例详细讲解突发传输中的地址对齐、数据分片等常见问题,并提供状态机设计、仿真波形分析和性能优化技巧,帮助开发者高效解决高速数据存储场景下的时序同步与数据一致性问题。 阅读详情

相关推荐

从零开始:如何在STM32上搭建QP框架实现事件驱动开发(附完整代码)

本文详细介绍了如何在STM32嵌入式平台上从零开始搭建QP框架,实现事件驱动开发。通过对比传统前后台系统与RTOS的局限,深入剖析了QP框架基于活动对象和层次式状态机的核心优势,并提供了完整的环境配置、代码移植及一个智能灯光控制器的实战案例,帮助开发者构建清晰、可维护的复杂嵌入式应用。

weixin_29200741的博客 489

Apache Druid数据查询套件详解计数、排名和分位数计算(送JSON-over-HTTP和SQL两种查询详解)

Bound Filter是比较过滤器,包含大于,等于,小于三种,它默认支持的就是字符串比较,是基于字典顺序,如果使用数字进行比较,需要在查询中设定alpaNumeric的值为true,需要注意的是Bound Filter默认的大小比较为>=或者

博学谷狂野架构师的博客 1638

Skiplist,B,B+tree,LSM tree

SkipList 理解(如何实现): 即使是有序的链表,查找的时间复杂度也是O(n),但链表不能随机访问所以不适用于二分查找,使得查找的时间复杂度为O(logn)。 于是将有序链表和二分查找结合得到了SkipList,类似于二叉搜索树,这是一种以空间换时间的算法,通过在每个节点中增加向前的指针,从而提升查找效率(如下图所示)。 一开始如a所示,是一个有序的链表,时间复杂度O(n)。随后建立了e所示的SkipList,从最顶层往下查找,可以跳过许多元素,减少查找次数。 ​

weixin_45875458的博客 948

Druid简介及常用查询操作

目录 一、druid主要功能介绍 二、druid使用场景 1、适用于如下场景 2、不适用于如下场景 三、常见查询操作 1、timeseries时间序列 2、TopN 3、GroupBy分组查询 4、scan扫描查询 5、search搜索查询 6、timeBoundary时间边界查询 7、segmentMetadata细分元数据查询 8、dataSourceMetadata数据源元数据查询 四、查询组件介绍 1、filter过滤器 (1)选择器过滤器selector (2)列

qq_38151401的博客 5474

Windows Server 2016 下载

Windows Server 2016 下载 简介: Windows Server 2016是微软于2016年10月13日正式发布的最新服务器操作系统。基于Win10 1607(LTSB)内核所开发。 Windows Server 2016 Essentials edition(精华版) Windows Server 2016 Essentials版是专为小型企业而设计的。它对应于Win...

StudyOgre的博客 1万+

基于Python适用于YOLO目标检测算法的图片数据增强处理

为了增强模型的鲁棒性以及数据的丰富性,同 时为了防止由于数据过少发生过拟合,本设计对数 据集进行数据增强处理,包括随机亮度调节、随机 对比度调节、随机饱和度调节、加入高斯噪声、水 平翻转、运动模糊和旋转 15°

weixin_67136409的博客 701

Druid 0.17入门(4)—— 数据查询方式大全

本文收录于专辑Druid入门指南持续更新中~本文介绍Druid查询数据的方式,首先我们保证数据已经成功载入。Druid查询基于HTTP,Druid提供了查询视图,并对结果进行了格式...

大数据流动 824

遥感图像地物覆盖分类,数据集制作-分类模型对比-分类保姆级教程

1.新建shp文件地理坐标系保持和影像一致,面类型2.打开属性表3.添加字段这里分类6类,点击添加值添加添加完毕开始人工选地物类型,制作数据集开始标注,标注的时候可以借助谷歌地图来看标记足够多的样本打开面转栅格工具设置nodata值为15。

热爱分享,热爱记录 2527

Apache Druid入门系列(一):druid介绍

Druid 介绍Druid 常用应用领域:Druid 特点:Druid 适用场景Druid 不适用场景Druid 架构进程和服务器外部依赖架构图数据源和段查询处理 Apache Druid是一个用于大数据实时查询和分析的高容错、高性能开源分布式时序数据库系统,旨在快速处理大规模的数据,并能够实现快速查询和分析。尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid仍能够保持10...

qq_26860451的博客 3440

MTK(基础篇)ROM烧录以及分区的作用

本文介绍了MTK芯片设备的刷机流程及关键分区功能。首先通过MTK烧录工具加载ROM文件(包括引导文件和分区表),重点解析了各分区的核心作用:preloader类似BIOS负责硬件初始化;lk作为二级引导程序加载内核;vbmeta验证系统完整性;boot包含Linux内核;dtbo调整硬件配置;modem管理通信功能;tee保护生物识别数据;system/vendor分别存放系统核心和硬件驱动。特别指出preloader、vbmeta等关键分区损坏会导致设备变砖,而recovery分区是重要的救砖入口。全文简

weixin_49303682的博客 445

什么是 SAP Fiori 的 Technical Catalog

笔者之前的文章曾经提到一个叫做本文介绍 Technical Catalog 这个概念在 SAP Fiori 技术体系中的作用。首先我们如何在系统里查看这个 Catalog SAP_BASIS_TCR_T 里面包含的内容呢?如果大家照着本文开头那篇文章里提到的步骤,那么在自己系统里会创建好名叫的 PFCG role.我们登录 ABAP 系统,启动事务码 PFCG,打开这个 role, 就能看到它。展开之后,发现它扮演着一个容器的角色,里面包含了很多 ABAP 对象。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 744

druid 查条数_大数据分析druid实现双维度的topn查询

前言druid支持三种数据查询类型。timeseries,topn,groupbytimeseries是无维度,topn支持单维度,groupby支持双维度。现在有一个需求:基于服务名和调用链的两个维度,从druid获取最大分位数的前五名数据。topn是单维度的。groupby是双维度的。但是没有排序查看官方文档groupby的查询格式。官网上明确标识可以通过groupby实现topn查询。{"q...

weixin_35825858的博客 490

基于STM32、HAL库的MCP4013T-103E/CH 数字电位器驱动程序设计

define MCP4013_I2C_ADDR (0x5F << 1) // HAL库使用7位地址左移1位,或直接使用0xBE/0xBF。#include "i2c.h" // 包含你的I2C初始化相关的头文件,例如由CubeMX生成的 i2c.h。大于127的值会被截断。// MCP4013的读操作:主机发起读取请求,从机返回当前滑片位置的一个字节。// 使用HAL_I2C_Master_Transmit直接发送数据。// 使用HAL_I2C_Master_Receive读取一个字节。

corlin6688的博客 127

【转载】DRuid 大数据分析之查询

转载自http://yangyangmyself.iteye.com/blog/2321759 1、Druid 查询概述 上一节完成数据导入后,接下来讲讲Druid如何查询及统计分析导入的数据。 Druid的查询是使用REST风格的HTTP请求查询服务节点(Broker、Historical、Realtime),这些服务节点暴露REST查询接口,客户端发送Json对象请求查询...

weixin_30653023的博客 130

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

broker druid 查询_Druid实时大数据分析介绍(一)

起因哗啦啦哗啦啦。。。疯狂划水的时候,项目总监过来说:小王啊,来办公室开个会……我顿时心情凝重,年底了公司到底要做出什么举措。。。到办公室正经危坐的我时不时打量着项目总监,好,人已经到齐了啊:咱们公司接下来……巴拉巴拉……好项目初期小王你要做好调研工作。我。。。调研开始调研,期间也咨询了许多技术大佬,刚开始觉得Dask不错,刚开始起步就踩了很多坑,当我看到Druid的时候,果断放弃了Dask,询问...

weixin_34036423的博客 384

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

broker druid 查询_Druid实时大数据分析安装和配置(四)

前面几篇文章咱们初识了Druid,下面咱们就愉快的安装吧。。。JAVA8安装官网自行下载Druid下载下载地址:https://druid.apache.org/downloads.htmlZookeeper 的安装下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper单机版安装部署1.将安装包上传到服务器,并解压安装tar -xzf apache-...

weixin_39827304的博客 194

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

大数据druid查询不支持分页_Druid实时大数据分析查询(六)

Druid的数据查询过程以及查询语法 Druid提供了HTTP REST风格的查询接口。用户对数据的查询通过HTTP请求发送到查询节点(Broker Node),然后查询节点转发至历史节点(Historical Node)或实时节点(Realtime Node)处理。 Druid包含多种查询类型,如对用户摄入Druid的数据进行TopN,Timeseries,GroupBy,Select,Sear...

weixin_28518991的博客 646

大数据druid查询不支持分页_Apache Druid —当代大数据分析的必要条件

术语"大数据"是指具有高容量,高速度和多样化的数据的数字存储。 大数据分析是使用软件来发现那些大型数据存储中的趋势,模式,相关性或其他有用见解的过程。 Apache Druid基本上有能力证明自己是构建大数据分析平台的骨干之一。根据Wikipedia的介绍,Druid是一种用Java编写的面向列的开源分布式数据存储。 Druid旨在快速提取大量事件数据,并在数据之上提供低延迟查询。Druid的核心...

weixin_29018335的博客 898

大数据分析druid实现双维度的topn查询

前言 druid支持三种数据查询类型。timeseries,topn,groupbytimeseries是无维度,topn支持单维度,groupby支持双维度。现在有一个需求:基于服务名和调用链的两个维度,从druid获取最大分位数的前五名数据。topn是单维度的。groupby是双维度的。但是没有排序 查看官方文档 groupby的查询...

weixin_34110749的博客 754

书籍-Druid实时大数据分析原理与实践

内容简介 Druid 作为一款开源的实时大数据分析软件,最近几年快速风靡全球互联网公司,特别是对于海量数据和实时性要求高的场景,包括广告数据分析、用户行为分析、数据统计分析、运维监控分析等,在腾讯、阿里、优酷、小米等公司都有大量成功应用的案例。《Druid实时大数据分析原理与实践》的目的就是帮助技术人员更好地深入理解Druid 技术、大数据分析技术选型、Druid 的安装和使用、高级特性的使用,也

风流三月1 2295

大数据-156 Apache Druid 案例实战 Scala Kafka 订单统计

假设我们在构建一个用户行为分析系统,通过 Kafka 采集用户点击日志,并通过 Druid 实时分析用户行为。运行测试的SQL,一切正常!

m0_74825003的博客 992

druid简介

Druid的由来 随着大数据分析需求的爆炸性增长,很多公司都经历过将以关系型商用数据库为基础的数据平台,转移到一些开源生态的大数据平台,例如Hadoop 或Spark 平台,以可控的软硬件成本处理更大的数据量。Hadoop 设计之初就是为了批量处理大数据,但数据处理实时性经常是它的弱点。例如,很多时候一个MapReduce 脚本的执行,很难估计需要多长时间才能完成,无法满足很多数据分析师所期望的...

asfjgvajfghaklsbf的博客 2093

每周一本书之《Druid实时大数据分析原理与实践》

随着社交通信、数字广告、电子商务、网络游戏等商业模式的发展,越来越多的互联网企业诞生。他们都享受了大数据基础技术的红利,从初始就具备比较强大的数据收集、分析和处理能力,并且可以用在业务优化上。 很显然,因为行业的多样性,业务场景变得越来越复杂,对数据处理的要求已经不仅是体量大和速度快,还要数据结构灵活、编程接口强大、系统可扩展、原子化操作、高效备份、读性能加速或者写性能加速等。在这个技术普及

qq646748739的专栏 3646

druid使用

druid使用 一、安装 druid安装 使用hdp中druid-0.10.1 配置sql支持: ​ Custom druid-broker添加 druid.sql.enable=true 组件: Broker 8082 Coordinator 8081 Overlord 8090 Router 8888 Hist...

ukakasu的博客 940
上一篇: Druid 大数据分析之快速应用(单机模式)
下一篇: https://github.com/apache/storm/commit/b6cab8dca97e2238aef8e45118f6946fc2d35049#diff-6ab5421905cac64
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值