首页 文章 精选 留言 我的

精选列表

搜索[bi],共1939篇文章
优秀的个人博客,低调大师

ES in BI

一直想找一个用于大数据平台实时OLAP(甚至是实时计算)的框架,之前调研的Druid(druid.io)太过复杂,整个Druid由5、6个服务组成,而且加载数据也不太方便,性能一般,亦或是我还不太会用它。后来发现使用ElasticSearch就可以满足海量数据实时OLAP的需求。 ElasticSearch相信大家都很熟悉了,它在搜索领域已经有了举足轻重的地位,而且也支持越来越多的聚合统计功能,还和YARN、Hadoop、Hive、Spark、Pig、Flume等大数据框架兼容的越来越好,比如:可以将ElasticSearch跑在YARN上,还可以在Hive中建立外部表映射到ElasticSearch的Index中,直接在Hive中执行INSERT语句,将数据加载进ElasticSearch。 所谓OLAP,其实就是从事实表中统计任意组合维度的指标,也就是过滤、分组、聚合,其中,聚合除了一般的SUM、COUNT、AVG、MAX、MIN等,还有一个重要的COUNT(DISTINCT),看上去这些操作在SQL中是非常简单的统计,但在海量数据、低延迟的要求下,并不是那么容易做的。 ElasticSearch本来就是做实时搜索的,过滤自然不是问题,现在也支持各种聚合以及Pipeline aggregations(相当于SQL子查询的功能),而且ElasticSearch的安装部署也非常简单,一个节点只有一个服务进程,关于安装配置可参考:http://lxw1234.com/archives/2015/12/582.htm 本文以两个业务场景的例子,看一下ElasticSearch是如何满足我们的需求的。 例子1:网站流量报告 在我们的报表平台有这样一张报表,用于查看每个网站每天的流量指标: 其中,维度有:天、小时、网站,指标有:PV、UV、访问次数、跳出率、平均停留时间、回访率等。另外,还有一张报表是地域报告,维度多了省份和城市,指标一样。目前的做法是将可选的维度组合及对应的指标先在Hive中分析好,再将结果同步至MySQL,供报表展现。 真正意义上的OLAP做法,我是这样做的:在Hive分析好一张最细粒度为visit_id(session_id)的事实表,字段及数据如下: 然后将这张事实表的数据加载到ElasticSearch中的logs2/sitelog1211中。查看数据: curl -XGET 'http://localhost:9200/logs2/sitelog1211/_search?pretty' { "took" : 1015, "timed_out" : false, "_shards" : { "total" : 10, "successful" : 10, "failed" : 0 }, "hits" : { "total" : 3356328, "max_score" : 1.0, "hits" : [ { "_index" : "logs2", "_type" : "sitelog1211", "_id" : "AVGkoWowd8ibEMoyOhve", "_score" : 1.0, "_source":{"cookieid" : "8F97E07300BC7655F6945A","siteid" : "633","visit_id" : "feaa25e6-3208-4801-b7ed-6fa45f11ff42","pv" : 2,"is_return_cookie" : 0, "is_bounce_visit" : 0,"visit_stay_times" : 34,"visit_view_page_cnt" : 2, "region" : "浙江","city" : "绍兴"} }, …… 该天事实表中总记录数为3356328。 接着使用下面的查询,完成了上图中网站ID为1127,日期为2015-12-11的流量报告: curl -XGET 'http://localhost:9200/logs2/sitelog1211/_search?search_type=count&q=siteid:1127&pretty' -d ' { "size": 0, "aggs" : { "pv" : {"sum" : { "field" : "pv" } }, "uv" : {"cardinality" : {"field" : "cookieid" ,"precision_threshold": 40000}}, "return_uv" : { "filter" : {"term" : {"is_return_cookie" : 1}}, "aggs" : { "total_return_uv" : {"cardinality" : {"field" : "cookieid" ,"precision_threshold": 40000}} } }, "visits" : {"cardinality" : {"field" : "visit_id" ,"precision_threshold": 40000}}, "total_stay_times" : {"sum" : { "field" : "visit_stay_times" }}, "bounce_visits" : { "filter" : {"term" : {"is_bounce_visit" : 1}}, "aggs" : { "total_bounce_visits" : {"cardinality" : {"field" : "visit_id" ,"precision_threshold": 40000}} } } } }' 基本上1~2秒就可以返回结果: { "took" : 1887, "timed_out" : false, "_shards" : { "total" : 10, "successful" : 10, "failed" : 0 }, "hits" : { "total" : 5888, "max_score" : 0.0, "hits" : [ ] }, "aggregations" : { "uv" : { "value" : 5859 }, "visits" : { "value" : 5889 }, "return_uv" : { "doc_count" : 122, "total_return_uv" : { "value" : 119 } }, "bounce_visits" : { "doc_count" : 5177, "total_bounce_visits" : { "value" : 5177 } }, "pv" : { "value" : 10820.0 }, "total_stay_times" : { "value" : 262810.0 } } } 接着是地域报告中维度为省份的指标统计,查询语句为: curl -XGET 'http://localhost:9200/logs2/sitelog1211/_search?search_type=count&q=siteid:1127&pretty' -d ' { "size": 0, "aggs" : { "area_count" : { "terms" : {"field" : "region","order" : { "pv" : "desc" }}, "aggs" : { "pv" : {"sum" : { "field" : "pv" } }, "uv" : {"cardinality" : {"field" : "cookieid" ,"precision_threshold": 40000}}, "return_uv" : { "filter" : {"term" : {"is_return_cookie" : 1}}, "aggs" : { "total_return_uv" : {"cardinality" : {"field" : "cookieid" ,"precision_threshold": 40000}} } }, "visits" : {"cardinality" : {"field" : "visit_id" ,"precision_threshold": 40000}}, "total_stay_times" : {"sum" : { "field" : "visit_stay_times" }}, "bounce_visits" : { "filter" : {"term" : {"is_bounce_visit" : 1}}, "aggs" : { "total_bounce_visits" : {"cardinality" : {"field" : "visit_id" ,"precision_threshold": 40000}} } } } } } }' 因为要根据省份分组,比之前的查询慢一点,但也是秒级返回: { "took" : 4349, "timed_out" : false, "_shards" : { "total" : 10, "successful" : 10, "failed" : 0 }, "hits" : { "total" : 5888, "max_score" : 0.0, "hits" : [ ] }, "aggregations" : { "area_count" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 2456, "buckets" : [ { "key" : "北京", "doc_count" : 573, "uv" : { "value" : 568 }, "visits" : { "value" : 573 }, "return_uv" : { "doc_count" : 9, "total_return_uv" : { "value" : 8 } }, "bounce_visits" : { "doc_count" : 499, "total_bounce_visits" : { "value" : 499 } }, "pv" : { "value" : 986.0 }, "total_stay_times" : { "value" : 24849.0 } }, { "key" : "山东", "doc_count" : 368, "uv" : { "value" : 366 }, "visits" : { "value" : 368 }, "return_uv" : { "doc_count" : 9, "total_return_uv" : { "value" : 9 } }, "bounce_visits" : { "doc_count" : 288, "total_bounce_visits" : { "value" : 288 } }, "pv" : { "value" : 956.0 }, "total_stay_times" : { "value" : 30266.0 } }, …… 这里需要说明一下,在ElasticSearch中,对于去重计数(COUNT DISTINCT)是基于计数估计(Cardinality),因此如果去重记录数比较大(超过40000),便可能会有误差,误差范围是0~2%。 例子2:用户标签的搜索统计 有一张数据表,存储了每个用户ID对应的标签,同样加载到ElasticSearch中,数据格式如下: curl -XGET 'http://localhost:9200/lxw1234/user_tags/_search?&pretty' { "took" : 220, "timed_out" : false, "_shards" : { "total" : 10, "successful" : 10, "failed" : 0 }, "hits" : { "total" : 820165, "max_score" : 1.0, "hits" : [ { "_index" : "lxw1234", "_type" : "user_tags", "_id" : "222222222222222", "_score" : 1.0, "_source":{"sex" : "女性","age" : "27到30岁","income" : "5000到10000","edu" : "本科", "appcategory" : "娱乐类|1.0","interest" : "","onlinetime" : "9:00~12:00|1.0","os" : "IOS|1.0", "hobby" : "游戏|28.57,房产|8.57,服饰鞋帽箱包|28.57,互联网/电子产品|5.71,家居|8.57,餐饮美食|5.71,体育运动|14.29","region" : "河南省"} } ...... 每个用户都有性别、年龄、收入、教育程度、兴趣、地域等标签,其中使用_id来存储用户ID,也是主键。 查询1:SELECT count(1) FROM user_tags WHERE sex = ‘女性’ AND appcategory LIKE ‘%游戏类%'; curl -XGET 'http://localhost:9200/lxw1234/user_tags/_count?pretty' -d ' { "filter" : { "and" : [ {"term" : {"sex" : "女性"}}, {"match_phrase" : {"appcategory" : "游戏类"}} ] } }' 返回结果: { "count" : 106977, "_shards" : { "total" : 10, "successful" : 10, "failed" : 0 } } 查询2:先筛选,再分组统计: SELECT edu,COUNT(1) AS cnt FROM user_tags WHERE sex = '女性' AND appcategory LIKE '%游戏类%' GROUP BY edu ORDER BY cnt DESC limit 10; 查询语句: curl -XGET 'http://localhost:9200/lxw1234/user_tags/_search?search_type=count&pretty' -d ' { "filter" : { "and" : [ {"term" : {"sex" : "女性"}}, {"match_phrase" : {"appcategory" : "游戏类"}} ] }, "aggs" : { "edu_count" : { "terms" : { "field" : "edu", "size" : 10 } } } }' 返回结果: { "took" : 479, "timed_out" : false, "_shards" : { "total" : 10, "successful" : 10, "failed" : 0 }, "hits" : { "total" : 106977, "max_score" : 0.0, "hits" : [ ] }, "aggregations" : { "edu_count" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "本科", "doc_count" : 802670 }, { "key" : "硕士研究生", "doc_count" : 16032 }, { "key" : "专科", "doc_count" : 1433 }, { "key" : "博士研究生", "doc_count" : 25 }, { "key" : "初中及以下", "doc_count" : 4 }, { "key" : "中专/高中", "doc_count" : 1 } ] } } } 从目前的调研结果来看,ElasticSearch没有让人失望,部署简单,数据加载方便,聚合功能完备,查询速度快,目前完全可以满足我们的实时搜索、统计和OLAP需求,甚至可以作为NOSQL来使用,接下来再做更深入的测试。 另外,还有一个开源的SQL for ElasticSearch的框架Crate(crate.io),是在ElasticSearch之上封装了SQL接口,使得查询统计更加方便,不过SQL支持的功能有限,使用的ElasticSearch版本较低,后面试用一下再看。

优秀的个人博客,低调大师

BlueMix与商业智能BI(开篇:前言)

前言 智慧医疗英文简称WIT120,是最近兴起的专有医疗名词,通过打造健康档案区域医疗信息平台,利用最先进的物联网技术,实现患者与医务人员、医疗机构、医疗设备之间的互动,逐步达到信息化。 在这个过程中,医疗设备所产生的数据将会是非常庞大的,我们常见的包括血压、血氧数据,体温、流量、鼾声、心率、通气、BMP信息等,除此以外,某些设备自身的信息量也非常重要,包括压力、开关机时间、延时时间、断电报警、模式、设备ID等,这些信息通过物联网方式(当然也有其他方式)传输到数据中心,经由大数据分析平台最终形成统一的分析报告,提供医生、专家乃至病患者进行分析和查看。 本次博文将尝试使用Bluemix作为整体平台,在平台上部署信息采集应用、数据库应用以及分析应用,最终达到模拟分析的目的。

优秀的个人博客,低调大师

BlueMix与商业智能BI(智慧医疗场景)

开篇:前言 智慧医疗英文简称WIT120,是最近兴起的专有医疗名词,通过打造健康档案区域医疗信息平台,利用最先进的物联网技术,实现患者与医务人员、医疗机构、医疗设备之间的互动,逐步达到信息化。 在这个过程中,医疗设备所产生的数据将会是非常庞大的,我们常见的包括血压、血氧数据,体温、流量、鼾声、心率、通气、BMP信息等,除此以外,某些设备自身的信息量也非常重要,包括压力、开关机时间、延时时间、断电报警、模式、设备ID等,这些信息通过物联网方式(当然也有其他方式)传输到数据中心,经由大数据分析平台最终形成统一的分析报告,提供医生、专家乃至病患者进行分析和查看。 本次博文将尝试使用Bluemix作为整体平台,在平台上部署信息采集应用、数据库应用以及分析应用,最终达到模拟分析的目的。 第一部分 Bluemix使用 有关Bluemix的使用以及相关的DEMO示例在本次博文中将不再赘述,如有读者对Bluemix的使用不是很了解的,可以参考如下连接: 《15 部最优秀的 Bluemix教程》 http://www.ibm.com/developerworks/cn/cloud/library/cl-bestoflbluemix2014/index.html 上述教程应该能够带你进入到Bluemix的全新世界。 在这个部分中,必须确保如下事项: 1)注册一个Bluemix账户,并能够登录查看个人空间 2) 熟悉JAVA编程语言,能够编写简单的JAVA程序 第二部分 Bluemix应用创建 1.创建工作空间 首先我们需要登录Bluemix,在仪表盘面板中我们可以创建工作空间,如下图,我创建了名称为”demo”的工作空间: 2.创建应用程序 然后在这个demo空间中创建应用程序: 3.选择应用程序模板 之后便是选择应用程序模板: 在这里我们选择的是WEB应用程序。 4.选择启动器 紧接着我们选择启动器,这里我们选择的是Liberty for Java 5.命名应用程序 接下来我们要为我们的应用程序命名,在这里我们暂时命名为:cognos6647(各位可以任意调整为自己喜欢的名字。 6.完成应用程序创建 应用程序创建完成后可以看到提示“您的应用程序已准备就绪:http://cognos6647.mybluemix.net/”,如下图所示: 可以打开该链接: 如果页面提示“Hi World!”,表示您的应用程序已经创建成功,接下来我们就可以上我们的应用了。 第三部分 创建数据库服务 在这部分我们将分为两部分来讲解: 首先是添加MongoDB 或 MongoLab服务,这是为了后续创建支持报告服务所需的数据库实例。具体操作步骤如下: 1.添加数据库服务 在我的仪表盘中点击“添加服务或API”, 然后进入服务选择区域,选择“数据管理”类别: 紧接着在右侧的服务种类中选择mongodb服务: (当然在这里其实有很多种选择,大家可以选择自己最熟悉的,比如mysql、postgresql等。 进入mongodb的配置界面: 设置好相应的服务名称(这里我们随机),点击【创建】即可: 此时会提醒“重新编译打包应用程序”,选择【重新编译打包】即可(等待打包发布): 2.添加SQL数据库实例 继续回到应用程序仪表盘界面,继续“添加服务或API”(此处截图省略),紧接着继续选择类别“数据管理”,在其中选择“SQL Database” 进入SQL Database的配置界面(主要是服务名称以及套餐的选择,默认即可): 点击【创建】,此时同样会提醒“重新编译打包应用程序”,选择【重新编译打包】即可(等待打包发布,具体截图同上,此处省略)。 3.查看环境变量 回到仪表盘,在Liberty forJava中我们可以点击“环境变量”,看到此时环境变量(VCAP_SERVICES)中多了刚刚配置的数据库的相关信息: 第四部分 编写及部署应用程序 1.数据库初始化 在这部分我创建了一个DBUtil.java程序,用于JAVA API初始化数据库,其实相当于我们在WEB应用中经常使用的数据库类而已。 1)初始化参数 2)获取环境变量,并进行判断 3)连接数据库 4)创建表 5)插入数据 2.表创建 在数据库创建完成后,我们新建几个表。 【表一】sample_data_detail 该表用于存储呼吸机采集的数据,包括用户的漏气、压力、BPM等 字段名 类型 备注 MAC_ID VARCHAR 呼吸机编号 LEAK_VALUE NUMBER 漏气值 PRESSURE_VALUE NUMBER 压力值 BPM_VALUE NUMBER BPM值 CREATE_TIME VARCHAR 记录时间 【表二】time_dem 这个表作为时间维度表,主要用于关联【表一】进行多维分析(可以钻取、切片、旋转分析等) 字段名 类型 备注 YEAR VARCHAR 年 MONTH VARCHAR 月 DAY VARCHAR 日 DATE DATE 日期 DATE_TIME VARCHAR 主键 创建表的时候直接调用DBUtil中的createTable方法即可。 说明:这里我只用了一个时间维度,主要是演示方便,以后可以添加其他相关维度,那样的话效果应该会更好。 3.插入数据及数据查询 正常建完数据库表后,我们执行数据插入命令以及数据查询命令,确认数据库连接情况。 插入数据时只需要调用DBUtil中的insertData方法即可。 第五部分 应用程序调测 上述代码都完成后,我们将应用部署并进行调测。具体步骤如下: 1.打包 这里采用ANT进行打包,如下图所示: 右键build.xml选择Run As –》 Ant Build即可。完成后提示如下: 2.上传部署 上传的过程在此就不多说了,采用的是CF工具进行部署。 核心命令为: cf push <app_name> -p webStarterApp.war 各位看官自行尝试。 第六部分 创建Cognos服务 1.添加 Embeddable Reporting服务 在Bluemix中,其实是通过使用Bluemix Embeddable Reporting 服务来实现Cognos的报表功能的。 同第五部分创建数据库服务一样,在Bluemix提供的服务中,我们在类别“业务分析”中可以看到有个服务叫做“Embeddable Reporting”,选择该服务: 同样,在打开“EmbeddableReporting”配置窗口中,配置相应的服务名称: 2.收集环境变量 创建好Cognos服务后,我们同样按照SQL一样,在环境变量中可以看到如下信息: 第七部分 配置Cognos服务 1.打开 Embeddable Reporting控制台 创建好Cognos服务后,我们还需要进行相应的配置。 回到仪表盘界面,在服务栏中可以看到我们添加的“Embeddable Reporting”服务,点击进入: 点击上图中的【LAUNCH】按钮,打开EmbeddableReporting的控制台: 在该控制台中点击【Connect】,打开连接配置: 在此页面输入之前配置Mongodb时的环境变量中的uri,然后点击【Update】,此时控制台将会显示如下图所示的*号,表示已建立连接: 2.创建新的应用程序 1) 在上述基础上点击*号,在弹出的创建新应用提示中输入名称和描述 2) 配置数据源 点击【Continue】后进入数据源配置界面 输入相应的参数(这些参数在第五部分讲到添加数据库服务时有提到在环境变量中可以查看)。 3) 修改数据源/查看数据源 配置完后,可以看到创建的应用相关信息: 此时可以点击文件夹图标中的Data Source进行数据源的修改和查看: 此处可以看到数据源名称为:datasource,为了方便后续应用,我们暂时改成“cgds”(cognos datasource的缩写,哈哈O(∩_∩)O) 3.配置Visualization Bundles 这部分主要是可视化关联配置,如下图所示: 4.创建Report 1)单机文件夹符号打开Report选项卡 2)单击“*”号进行报表配置: 输入报表名称 3)报表配置 设置报表的Package以及相关的描述即可。 第八部分 使用Cognos进行数据分析 这部分其实就是最后的展现了,可以有多种展现效果: 1)饼图 2)柱状图 3)仪表盘 实际上,对于呼吸机上传的数据,我这次示例中主要从时间的角度查看数据的演变趋势,来了解病人的情况。 例如: 由于本次仅仅作为一个DEMO,数据量比较少,图形上展现可能并不是很丰富,但是主要是为了展现这样的一个过程,因此还请各位看官见谅。 结论 小结:其实在整个过程中我也不是很自信,不确认Bluemix是否支持我所想实现的东西,然后在写这篇博文的过程中也请教了很多前辈,并且查阅了IBM Bluemix的相关教程。我相信Bluemix能够为开发者带来一些新鲜的元素,关键在于大家敢于去尝试,敢于去创新。

优秀的个人博客,低调大师

Tableau BI工具对接 AnalyticDB for PostgreSQL数据源

AnalyticDB for PostgreSQL(原HybridDB for PostgreSQL)作为高性能分析型数据库,可以支持用户对其业务数据进行实时分析,能够让企业敏锐感知市场动态,做出必要决策。Tableau是一款数据分析与可视化工具,它支持连接本地或云端数据,不管是电子表格,还是数据库数据,都能进行无缝连接。本文介绍Tableau以AnalyticDB for PostgreSQL作为数据源,如何进行有效的数据分析。 使用AnalyticDB for PostgreSQL AnalyticDB for PostgreSQL基于Greenplum,所以在选择连接器的时候选择Greenplum连接器: 点开出现登录页面,填上DB的连接信息完成登录。登录后页面: 根据指导操作,可以将任意表进行统计分析,并进行报表展示。 例如使用TP

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册