利用开源技术建立数据仓库 ¶
目录
简介
本文面向的读者
为什么要建立数据仓库
创建数据仓库
设计一个纬度化的数据仓库
提出问题
结构模型化
选择事实元素的粒度(fact grain)
添加纬度
构建数据仓库
使用Spoon设计转换
一些准备工作
更新第一种纬度
更新第二种纬度表和事实表
聚合数据
将所有工作合到一起
使用数据仓库
准备在线分析处理
从关系化到纬度化
使用Mondrian做数据分析
执行多维查询
可视化和展示
附录A:技术简介
Kettle
Mondrian
Jpivot
附录B:使用JavaScript生成日期纬度
附录C:Mondrian XML schema示例
参考
版本介绍
简介 ¶
本文的主要内容是建立数据仓库。数据仓库是一种计算机数据库系统,用于收集、整合和存储组织的数据,帮助生成准确的、时间性的管理信息,以及支持数据分析。本文解释了一个好的数据仓库的重要性,并涵盖了利用开源技术建立一个数据仓库的流程。
本文面向的读者 ¶
本文主要面向软件开发者、数据库管理员、软件集成商,或者其它有兴趣面临大数据量业务数据分析挑战的读者。阅读本文的读者需要具备数据库、信息系统和业务事务的基本只是。
为什么要建立数据仓库 ¶
有很多理由说明建立数据仓库的重要性,但是大部分理由都可以归纳为一个基本的愿望:提供一种数据分析的方式,来支持管理决策。你可能已经为管理者提供过很 多数据,例如:信息系统网站的使用统计,引用趋势,以及注册用户的数量。这些都是基本的信息,可以直接从信息系统获得。然而,这些数据存在很大的缺陷。
首先,直接从信息系统提取数据无疑会增加系统的负载。而数据分析过程通常需要进行大规模地数据处理。另外,处理过程中可能会发生其它一些问题,例如,在数据提取过程中系统数据库的表被锁定。而数据仓库与信息系统是完全分离的,甚至可以运行于不同的系统。
其次,一个OLTP(联 机事务处理)系统的数据模型是针对数据分析专门优化的。以前,我们都是根据我们的实体关系,来开发使用正规化数据库模型的系统。这对于信息系统来说,是合 适的,因为基础模型能够正确反映系统的情况。但是,这种模型使得查询大数据量聚合数据变得非常困难。而且,这种数据库设计的冗余能力很差,因为难以维护, 经常造成数据不一致,甚至更糟。而对于数据分析,数据冗余非常有用,它会提高处理效率。
此外,OLTP(联机事务处理)系统中的数据可以随时间变化。例如,在一个在线的客户关系管理系统中,客户迁徙到其它国家,在这种情况下,可以采用多种方式进行数据处理:
更新客户的记录,消除其先前的国家信息和分析信息;
在应用系统中创建新的记录,用于记录这个客户信息。
这两种方式都不太令人满意,因为它们丢失了客户的历史信息。而数据仓库能够解决这个问题,在数据仓库中,可以保存客户在所有时期内的状态记录,从中很容易得到起变化情况。
最后,可能存在很多信息系统不用的数据源,这些数据源可以用于数据分析。数据仓库可以为所有这些数据提供集中的存储,收集到的信息可以在一步内完成查询。
创建数据仓库 ¶
在本章中,我将指导你使用不同的方式来创建数据仓库。我将用一个基于web的简单信息系统来描述如何建立一个数据仓库。这个基于web的信息系统包括请求、用户和页面之类的信息实体。这个信息系统的数据模型暂缺 。
设计一个纬度化的数据仓库 ¶
提出问题 ¶
创建数据仓库最重要的步骤是设计。你可能会嘀咕:“管理层希望知道什么?”。首先,你不得不通过分析数据的属性,找出需要回答的问题。例如,用户和 页面存在关联吗?是否存在某类的用户只访问某些页面,不访问其它的页面?访问者从哪些页面来,到哪些页面去?我相信通过这种方式,至少在80%的问题上, 管理层会给出满意的答案。
既然你已经读到了这里,我就假定你公司管理层已经回答了类似的问题。如果没有,就让他们做。不要小看这个阶段,它是数据仓库成败的基础。
结构模型化 ¶
一旦你通过一些问题获得了管理层的关注点,下一步就是要根据这些关注点决定如何安排数据仓库中的数据。例如,销售人员的数据应该在多种不同的结构中进行操作,而不应该只局限于职位。在OLAP世界中,这些结构叫做数据立方体(Cube?),因为它是传统二维数据库的扩展。根据数据的不同,一个数据立方体可以有两个以上的纬度。我们将在关系数据库中,利用星形模式为数据立方体(Cube?)建模,利用一个fact(好多人翻译为事实?)表,将一系列的纬度表连接起来。
选择事实元素的粒度(fact grain) ¶
创建数据立方体(Cube?) 的关键是为其找一个好的事实表(fact table)。这一步的操作很简单,在事实表(fact table)中,每一个“事实(fact)”元素各占一行,因此难点变成了如何添加有用的纬度。好的事实表的标准是,数据的粒度尽可能细。数据立方体经常 是单个事务,例如支付,在我们的例子中,是页面请求。
添加纬度 ¶
现在我们有了一个数据立方体的中心起始点,现在是时间加入新的纬度来修饰基本事实元素,纬度表保存事实元素的属性。如果你想不出事实表的任何纬度, 可能是因为起始的粒度选择存在问题。在所有的纬度中,时间纬度是最为显而易见的。在时间轴上,每个请求都有一个位置,因此我们建立一个纬度表"time" 来保存所有的请求实体,这个表的每个记录代表每个记录发生的时间。如果两个请求同时发生,在时间纬度表中它们被连接到同一个实体。
我们还需要添加一个代表页面的纬度。每个条目都是一个页面信息,对应事实表中的一个请求。
最后,我们还需要添加一个纬度,表示发起请求的用户。事实表中的每个请求,都是由已知用户,或者根本不是用户发起的,所有这些都报存在用户纬度表。
在我们创建并连接纬度表时,需要遵循一个重要的规则,不要使用在线系统的现有键,因为我们根本无法对其进行任何控制,它们或许会改变,甚至消失。作 为替代,每个纬度都需要一个自己的代理键,这个键称为“技术键(technical key)”,在整个数据仓库中都是唯一的。
构建数据仓库 ¶
现在我们知道,数据立方体会被表达为星形模式,下面我们将开始构建工作。在这一步,我们将使用来自于OLTP系统的数据填充一个数据仓库。这个阶段的流程叫做ETL?,即提取、转换、加载。这是我们所需要做的,从各种数据源中提取事实表和纬度表所需的数据,转换为我们所需要的形式,加载到数据仓库,以备查询、分析。我们将使用KETTLE执行这些操作,KETTLE是一个开源的ETL?工具。KETTLE有两个软件包组成。Spoon和Pan用于创建和执行转换(transformation)操作,而Chef和Kitchen用于从转换(transformation)中定义作业并调度和执行它们。
使用Spoon设计转换 ¶
现在,我们开始使用Spoon创建一个用于填充数据仓库的转换(transformation)。为了填写事实表,到所有纬度的键必须是事先知道的。因此,我们需要明确区分两类纬度:
纬度的组成数据事先已经明确位于在线的信息系统。
纬度的组成数据需要从事实数据和周边数据源中生成。
在第二种情况下,我们是在填写事实表的过程中,生成或更新纬度数据的,因此可以同时得到其键值,但在第一种情况下,我们做不到。
在我们的例子中,时间和页面纬度属于第二种情况,就是说他们是在更新事实表的时候生成的。然而,由于用户纬度基于信息系统的表,需要提前获取其键 值。因此,我们将通过两个独立的转换(transformation)来填写数据仓库,第一个针对数据已经存在的用户纬度,而第二个针对其它纬度和事实 表。
一些准备工作 ¶
在使用Spoon之前,我们需要先定义数据源。在这个例子中,我们只有一个数据源:信息系统的数据库。我们需要将这个数据库作为一个连接(Connection) 添加到Spoon。我们的目的数据库连接也可以在此定义。
更新第一种纬度 ¶
在我们的例子中,用户 纬度是唯一一个不能在填写纬度表的过程中更新的纬度。用户数据已经被保存在源信息系统的一个表中,所以我们需要使用Spoon的“Dimension lookup/update” 功能将数据读出、处理。
这一步用于创建、更新和查询变化缓慢的纬度。数据源中的数据还会发生变更,例如用户信息会发生变化,处理数据更新有以下两种方式:
更新现有记录;
创建另外纬度记录,维护全部的过程记录。
如果使用第二种方式,就需要在纬度表中加入数据变更的识别信息,例如:“version”, “date_from” and “date_to”等。
在我们的例子中,我们需要按照第二种方式来处理用户纬度,所以Spoon中的转换(transformation)如图3所示。首先,从信息系统用户表中读出数据;接着,按照纬度表的要求使用"select" 指令对其进行过滤;最后,将过滤后的数据插入数据仓库的user_dim表中。在Spoon的文档中有详细的说明,所以我们接下来只介绍如何配置纬度查询/更新(dimension lookup/update) 。
由于我们是直接从信息系统的表中创建用户纬度表,所以信息系统用户表中的主键是多余的。在示例信息系统中,使用用户的email作为主键。而在数据 仓库中,我们使用一个唯一的技术主键代替原来的主键。后续的流程能够取得这个技术主键,用于纬度表和事实表的关联。在我们的例子中,这个技术主键字段叫做user_id 。
在信息系统用户表的字段中,我们需要指定对于纬度比较重要的字段。在我们的例子中,我们需要持续跟踪用户全名、所属公司和性别等信息。
对于第二种纬度,版本字段用于跟踪缓慢变更纬度的不同版本。而日期范围用于表示每个版本存在的期限。如果信息系统能够跟踪记录的变更,这有助于使用Stream Datefield 进行更好的数据校验,不过这已经超出本文的范围。通常,默认的已经足够了。
更新第二种纬度表和事实表 ¶
现在,第一种纬度已经准备就绪,现在需要做得是填写事实表。在这个流程中,需要更新剩下的纬度表,在需要时,使其技术建准备就绪。
我们以从请求日志中,为事实表提取基本粒度信息,作为工作的起点。
接着,使用Spoon的JavaScript step 提取请求日志的时间戳字段,生成日期纬度,代码见附录B:使用JavaScript生成日期纬度。使用Dimension Lookup/Update ,我们将这些数据放入数据库,然后使用技术键time_id 进行引用。
接下来就是用户纬度。记住,我们在上一步已经对用户纬度进行过更新,所有现在我们应该将其与事实表中的每个请求实体进行关联。通过对用户登录行为与会话的 查询,我们可以将会话与用户实现对应,进而实现用户与请求行为之间的对应。如果会话没有实现与用户的匹配,其键值(email)就设置为NULL,它匹配 一种特殊的情况:未知用户(the unknown user)。由于过滤操作是多线程操作的,因此我们使用Spoon的排序步骤(sort step) 对用户信息数据流进行排序。当数据进入“Lookup user_dim“ ,这股数据流包含一个额外的字段叫做"email",这个字段包含每个请求的email,如果未知则为NULL。记住,我们指定email 作为查询主键,所以使用这个字段,转换(transformation)步骤能够为数据流中的每个条目找到一个技术键,最后加入一个额外的字段user_id ,就构成了用户纬度表的条目内容。
页面纬度表所需的数据已经保存在请求日志中了,填写这个纬度表的都是层次化的数据,包括域名、路径、页面,最后生成一个技术键字段,就构成了一个页面纬度表的条目。
我们另外加了一个访问来源(Referrer)纬度,这个纬度我们上面没有提到过,与页面纬度相对应。
最后,将填写事实表的数据过滤出来,只包括纬度的技术键和事实元素。将他们插入表request_facts 中。
聚合数据 ¶
解释如何创建聚合表来加速分析操作。
将所有工作合到一起 ¶
通过上面的工作,我们完成了转换(transformation)设计,下面需要使用Kettle的Chef和Kitchen将这三个转换(transformation)顺序结合成一个作业,并在流程中加入日志和调试功能。
工具Chef无需多做解释,因为他的界面与Spoon是一样的。只不过,Spoon是将步骤(step)结合成转换(transformation),而 Chef将转换(transformation)组合成作业。由于Chef的文档很好,所以这里我们只用一个截屏来解释。
在我们的案例中,有两类纬度,因此将数据仓库的填写流程分为两个转换(transformation)阶段。首先,Chef执行更新用户纬度的转换 (transformation)。如果转换失败,它就发送一个包含细节错误信息的邮件;如果转换成功,就进入第二个阶段,更新其他纬度和事实表。在这个 例子中,我希望如果全部工作成功完成也收到一封邮件,因此将最后一步转换连接到Mail 。
最后需要说明,Chef可以对作业进行调度。利用命令行工具Kitchen,使Kettle成为一个强大的系统,用于创建、更新和维护数据仓库。
使用数据仓库 ¶
本章将讲述如何对数据仓库进行分析。
准备在线分析处理 ¶
在结构模型化,我们从采用星形模式建立一个数据立方体开始,数据立方体包含一个事实表将各个纬度表关联到一起。在数据立方体内,每个纬度都能够与其他纬度实现多对多的关联。
这种特殊的数据组织形式,使通过一种广义的表单方式进行数据查询成为可能。这就是OLAP服务器的任务。在我们的案例中,我们将使用开源的关系形OLAP服务器Mondrian完成这个工作。
从关系化到纬度化 ¶
上面解释过,数据仓库中的数据采用关系的方式存储。事实表是多个纬度的连接点,每个纬度都有自己的表和数据。在一个OLAP数据立方体中,数据以多维的方式进行组织。
每个数据立方体都包含多个指标(measure),这些指标可以从事实表中得到,用于计算聚合和分组数据。一个数据立方体的指标可以包括诸如:销售额、产 品价格或者这些事实元素的综合等。在非事实化的事实表中,可以没有任何指标。每个数据立方体都有多个纬度。一个纬度是一个查看数据的方向,由关系数据库的 一个一维表构成。最显而易见的纬度当然就是时间了。
每个纬度都可以有一个活多个层次。正如你所期待的那样,通过层次可以纬度的信息进行逐次聚合。例如,在时间纬度中,可以使用天-月-季度-年作为层次。在数据分析过程中,层次对于数据集合和分组是很有用的。
上述概念可以被OLAP服务器用于多维数据查询。下面我将告诉你如何配置Mondrian OLAP服务器来从事这个工作。
使用Mondrian做数据分析 ¶
Mondrian OLAP服务器的安装在此就不赘述了。安装完成之后,我们需要告诉它数据仓库的结构。这是由一种XML格式的文档实现的,文档包含OLAP数据立方体信 息,及其纬度、层次和指标信息,以及如何从关系数据库中生成这些信息。在我们的案例中,Mondrian的相关XML模式见附录C:Mondrian XML schema示例 。其中,只有一个数据立方体,叫做"Requests" ,这个立方体直接关联到表“request_facts” ,有一个指标和四个纬度。
在事实表中只有一个事实元素,因此我们无需过多关注,而指标也只有一个:每个请求id的数量,当然它永远等于一。
在数据立方体中,我们定义了四个纬度,用户(User)、页面(Page)、访问来源(Referrer),以及时间(Time)。每个纬度都有一个或多个层次。对于每个纬度,Mondrian需要知道是由那个表表示的,以及哪个键是事实表的外链键。
一旦Mondrian知道如何解释数据仓库的关系数据库,它就可以作为一个转换层,将多维数据查询转换到关系数据库。
执行多维查询 ¶
Mondrian利用OLAP数据立方体的纬度属性,向数据仓库提出尽可能复杂的问题。为了完成这项工作,Mondrian使用一种叫做MDX的语言,实现将多维变量到SQL转换。其语法如下所示:
SELECT [ [, ...]] FROM [] [WHERE []]
MDX与SQL不同,SQL查询只能范围二维数据集:一个表,包含固定的列数、多行记录,而MDX查询是针对多维数据集,返回的结果也可以有任何数量的纬度。例如,下面的一个查询可以查询在某些月中,哪些公司访问国我们的信息系统。
SELECT {[Time].[Months].Members} ON COLUMNS, {[Users].[Company Name].Members} ON ROWS FROM [Requests] WHERE [Time].[2006]
可视化和展示 ¶
最后,最终用户需要通过一个系统看到多维查询得到的各种结果,这可以通过JPivot实现。
JPivot已经包含到Mondrian的发布版本中了,无需多做设置。它的配置也非常简单:只要指定JSP文件使用的数据集,启动查询即可。再进一步, 大家可以考虑Pentaho。很多工程如:JPivot和JFreereports都已经集成到了Pentaho中,更加简化了生成展示界面的工作。
附录A:技术简介 ¶
在这一章中,我将简单介绍一些数据仓库创建过程中涉及到的一些关键技术,以及相关工程的连接。
Kettle ¶
http://www.kettle.be
Kettle是一个开源的ETL套件,能够从多种不同的数据源中提取数据,转换后加载到数据仓库。
Kettle包含部分工具:
Spoon和Pan用于创建和执行数据转换。
Chef和Kitchen用于将多个转换组合为作业,并调度和执行这些作业。
Mondrian ¶
http://mondrian.sourceforge.net
Mondrian是一个关系型OLAP服务器,作为关系数据库之上的一层,执行多维数据查询操作。。
Jpivot ¶
http://jpivot.sourceforge.net
JPivot是一个基于Mondrian的表示层工具。它生成多维查询指令,并将结果以交互式的数据透视表(pivot table)展示出来。
附录B:使用JavaScript生成日期纬度 ¶
A dimension present in almost all data warehouses is that of time. Spoon's JavaScript? step makes it easy to extract hierarchical data from date or time fields in the source system. While most of this is described in Spoon's documentation, an example of how to do this is given here. JavaScript code
// The fields we want to calculate var day_of_month ; var week_of_year ; var month_of_year ; var year ; var quarter ; var name_day ; var name_month ; // Calculate! day_of_month = dateTime . Clone (). dat2str ( "dd" ); week_of_year = dateTime . Clone (). Clone (). dat2str ( "ww" ); month_of_year = dateTime . Clone (). dat2str ( "MM" ); year = dateTime . Clone (). dat2str ( "yyyy" ); name_day = dateTime . Clone (). dat2str ( "E" ). getString (); name_month = dateTime . Clone (). dat2str ( "MMMM" ). getString (); if ( month_of_year <= 3 ) { quarter = "Q1" ; } else if ( month_of_year <= 6 ) { quarter = "Q2" ; } else if ( month_of_year <= 9 ) { quarter = "Q3" ; } else { quarter = "Q4" ; }
附录C:Mondrian XML schema示例 ¶
name= "DataWareHouseTest" > name= "Requests" > name= "request_facts" /> name= "Users" foreignKey= "user_id" > hasAll= "true" allMemberName= "All Users" primaryKey= "user_id" > name= "user_dim" /> name= "Company Branche" column= "companybranche" uniqueMembers= "false" /> name= "Company Name" column= "companyname" uniqueMembers= "false" /> name= "Role" column= "role" uniqueMembers= "false" /> hasAll= "true" primaryKey= "user_id" > name= "Sex" column= "sex" uniqueMembers= "false" /> name= "User" column= "email" uniqueMembers= "true" > name= "First Name" column= "firstname" /> name= "Infix" column= "infix" /> name= "Last Name" column= "lastname" /> name= "Page" foreignKey= "page_id" > hasAll= "true" primaryKey= "page_id" > name= "page_dim" /> name= "Domain" column= "domain" /> name= "Path" column= "path" /> name= "Page" column= "page" /> name= "Referrer" foreignKey= "referrer_id" > hasAll= "true" primaryKey= "referrer_id" > name= "referrer_dim" /> name= "Domain" column= "referrerDomain" /> name= "Path" column= "referrerPath" /> name= "Time" type= "TimeDimension" foreignKey= "time_id" > hasAll= "false" primaryKey= "time_id" > name= "time_dim" /> name= "Year" column= "year" type= "Numeric" uniqueMembers= "true" levelType= "TimeYears" /> name= "Quarter" column= "quarter" uniqueMembers= "false" levelType= "TimeQuarters" /> name= "Month" column= "month_of_year" uniqueMembers= "false" type= "Numeric" levelType= "TimeMonths" /> hasAll= "true" name= "Weekly" primaryKey= "time_id" defaultMember= "[Time.Weekly].[All Time.Weeklys]" > name= "time_dim" /> name= "Year" column= "year" type= "Numeric" uniqueMembers= "true" levelType= "TimeYears" /> name= "Week" column= "week_of_year" type= "Numeric" uniqueMembers= "false" levelType= "TimeWeeks" /> name= "Day" column= "day_of_month" uniqueMembers= "false" type= "Numeric" levelType= "TimeDays" /> name= "Pages" column= "id" aggregator= "count" datatype= "Integer" formatString= "#,##" />
参考 ¶
A Dimensional Modeling Manifesto – Ralph Kimball 1997
Slowly Changing Dimensions – Ralph Kimball 1996
Spoon Documentation – Pentaho 2001-2006
原文的地址: http://source.pentaho.org/svnkettleroot/Kettle/trunk/docs/English/Building-data-warehouses-using-open-source-technologies.odt
版本介绍 ¶
v146 - 1st of September 2006 – Initial release
The first version to be released to the community, still in draft form. I would like to thank my employer, Better be, for giving me the time and resources to work on this document. Without their support, this document would not exist. Also, I would like to thank, in advance, anyone who will contribute to this document in the future. You make open source to what it is today.
- Michel Jansen
v197 - 6th of October 2006
A revision with a lot of the sharp edges removed. 1.Fixed the calculation of quarters in the JavaScript? example – Thanks Paul Keenan 2.Corrected the “Asking questions” section – Thanks Ronald van der Blink
- Michel Jansen
你可能感兴趣的:(数据仓库)
数据仓库——维度表一致性
墨染丶eye
背诵 数据仓库
数据仓库基础笔记思维导图已经整理完毕,完整连接为:数据仓库基础知识笔记思维导图维度一致性问题从逻辑层面来看,当一系列星型模型共享一组公共维度时,所涉及的维度称为一致性维度。当维度表存在不一致时,短期的成功难以弥补长期的错误。维度时确保不同过程中信息集成起来实现横向钻取货活动的关键。造成横向钻取失败的原因维度结构的差别,因为维度的差别,分析工作涉及的领域从简单到复杂,但是都是通过复杂的报表来弥补设计
大模型训练数据库Common Crawl
WindyChanChan
数据集 语言模型 数据库
CommonCrawl介绍CommonCrawl是一个非营利组织,致力于通过大规模分布式爬虫系统定期抓取整个Web并将其存储在一个可公开访问的数据库中。CommonCrawl的数据收集和处理过程包括使用Python开源爬虫工具收集全球范围内的网站数据,并将其上传到CommonCrawl基金会的数据仓库中。该项目从2008年开始,至今已经积累了大量的原始网页数据、元数据和文本提取数据。这些数据
数据仓库介绍
阿龙的代码在报错
数据分析 数据仓库 数据库
数据仓库数据仓库的概念数据仓库的主要特征数据仓库的主流开发语言-sql结构化数据sql语句数据仓库的概念数据仓库(英语:DataWarehouse,简称数仓、DW),是一个用于存储、分析、报告的数据系统。数据仓库的目的是构建面向分析的集成化数据环境,分析结果为企业提供决策支持(DecisionSupport)。就是数据仓库只分析数据并不产生数据数据仓库的主要特征1、面向主题主题是一个抽象的概念,是
大数据之flink与hive
星辰_mya
大数据 flink hive
其实吧我不太想写flink,因为线上经验确实不多,这也是我需要补的地方,没有条件创造条件,先来一篇吧flink:高性能低延迟流批一体的分布式计算框架基于事件时间对实时数据精准处理快速响应支持批处理,高效离线分析和数据挖掘数据仓库的引擎丰富数据源/接收器,集成多种数据存储格式和源,比较常见就是咱们今天的主题hive了checkpoint恢复机制,故障恢复快速恢复计算任务分布式弹性扩展,据业务灵活增加
hive血缘关系之输入表与目标表的解析
zxfBdd
hive 大数据治理 大数据
接了一个新需求:需要做数据仓库的血缘关系。正所谓兵来将挡水来土掩,那咱就动手吧。血缘关系是数据治理的一块,其实有专门的第三方数据治理框架,但考虑到目前的线上环境已经趋于稳定,引入新的框架无疑是劳民伤财,伤筋动骨,所以就想以最小的代价把这个事情给做了。目前我们考虑做的血缘关系呢只是做输入表和输出表,最后会形成一张表与表之间的链路图。这个东西的好处就是有助于仓库人员梳理业务,后面可能还会做字段之间的血
影响数据分析导致数据建模错误!你可能都没发觉的几个小细节
丨程序之道丨
如果你有一个目标,想获得所有这些数据的可操作的见解,并一直在收集。那么,你如何确定模型的数据,以便实际上可以获得这些见解,并回答你的业务问题?你的计划。当规划阶段不充分或不完全,其结果是可怕的。那么分析和性能、数据完整性和安全性的问题接踵而至,将会使日常的维护和发展的成本达到了不必要的水平。避免常见的建模错误1.开始实施时没有明确的行动计划当涉及到的分析,如数据仓库或Elasticube建模数据资
从零到一建设数据中台 - 架构概览
我码玄黄
从零到一建设数据中台 架构 数据中台 中台架构
数据中台功能架构概览数据中台相关名词解释1.数据仓库:数据仓库是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合,用于支持管理决策。因此,其重点在于数据的集合。数据仓库可使用维度建模方法论从业务过程中抽象出通用维度与度量,组成数据模型,为决策分析提供通用的数据分析能力。数据仓库重在建数据,而数据中台则将建、治、管、服放到同样的高度,数据仓库只是数据中台的一个子集。用一个蔬菜储存的例子来简
Python基础知识进阶之正则表达式_头歌python正则表达式进阶
前端陈萨龙
程序员 python 学习 面试
最后硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是
离线数仓VS实时数仓
james二次元
数据仓库 数据仓库 大数据
离线数据仓库(OfflineDataWarehouse)和实时数据仓库(Real-timeDataWarehouse)的实施有一些相似之处,但也存在显著的差异。以下是两者在几个关键方面的对比:相同点:数据集成:都需要从多个数据源提取、转换和加载数据(ETL/ELT)。都需要处理数据清洗、去重和规范化,以保证数据的一致性和准确性。数据建模:都需要进行数据建模,设计数据仓库的星型或雪花模型,定义事实表
数仓建模之维度表&指标表
锵锵锵锵~蒋
数据研发 数据仓库 数据研发
在数据仓库中,维度和指标是两个重要的概念。维度(Dimension):维度是一种描述业务过程中各种属性的方法,用于对业务过程进行分析和归类。维度包括时间、地点、人员、产品、客户等各种业务属性,是数据分析的基础。指标(Measure):指标是衡量业务过程效果的标准,是数据分析的重要指标。指标包括数量、金额、时间、比率、百分比等,用于衡量业务过程的各种结果。在数据仓库中,通常会使用维度表和指标表来进行
Hadoop常见面试题整理及解答
叶青舟
Linux hdfs 大数据 hadoop linux
Hadoop常见面试题整理及解答一、基础知识篇:1.把数据仓库从传统关系型数据库转到hadoop有什么优势?答:(1)关系型数据库成本高,且存储空间有限。而Hadoop使用较为廉价的机器存储数据,且Hadoop可以将大量机器构建成一个集群,并在集群中使用HDFS文件系统统一管理数据,极大的提高了数据的存储及处理能力。(2)关系型数据库仅支持标准结构化数据格式,Hadoop不仅支持标准结构化数据格式
2024年最全使用Python求解方程_python解方程(1),字节面试官迟到
2401_84569545
程序员 python 学习 面试
最后硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是
一文说清什么是数据仓库
数据分析小兵
数据中台系列 spark 大数据 分布式 数据分析 数据挖掘 数据仓库
01数据仓库的概念数据仓库的概念可以追溯到20世纪80年代,当时IBM的研究人员开发出了“商业数据仓库”。本质上,数据仓库试图提供一种从操作型系统到决策支持环境的数据流架构模型。目前对数据仓库(DataWarehouse)的标准定义,业界普遍比较认可的是由数据仓库之父比尔·恩门(BillInmon)在1991年出版的“BuildingtheDataWarehouse”(《建立数据仓库》)一书中所提
美团点评酒旅数据仓库建设实践
大数据金猫
数据仓库
美团点评酒旅数据仓库建设实践:https://tech.meituan.com/2017/05/26/hotel-dw-layer-topic.html
大数据平台--调度系统
小瓶盖的猪猪侠
调度系统是数据仓库的重要组成部分,也是每个银行或公司一个基础软件或服务,需要在全行或全公司层面进行规划,在全行层面统一调度工具和规范,由于数据类系统调度作业较多,交易类系统批量优先级高,调度系统的整体架构如下:调度中心对调度批次和作业进行创建、管理、监控,它负责所有批量作业的调度和编排;在整个作业过程中,作业之间关系分为触发,依赖和互斥。1、触发触发关系表示一个作业完毕后,生成另一个作业的控制文件
数据库,数据仓库,数据湖,湖仓一体到底是什么区别
大数据小尘
数据库 数据仓库 spark
昨天结束的一场面试,面试官问了下我对数据仓库和数据湖的理解,根据之前的理解我说了下数据湖是数据仓库某些时候的缓存,然后面试官反问说我确定这个用词对吗?没理解到位,所以去了解之后再整体输出下我自己的理解。先说下上面的答案,数据仓库和数据湖可以是互相独立存在的,不存在谁是谁的缓存一说,但是如果涉及到湖仓一体的时候,数仓是结构化的数据访问入口,而底层的数据湖是可以作为数仓的底层的存储支持。要了解各个概念
第八章 外部数据和数据仓库
晨磊的微博
[TOC]第八章外部数据和数据仓库8.0概述外部数据:产生于企业外部系统的数据(非企业内部系统)外部数据典型来源:商报、新闻、研究报告、分析报告等外部数据不能自由导入,需要统一进入仓库原因1:自由导入容易丢失源信息原因2:自由导入数据难以再次使用8.1数据仓库中的外部数据外部数据:出现没有固定频率,不便永久监控完全没有规则,必须格式化不可预测,任何时候可能来自于任何数据源8.2元数据和外部数据元数
数据仓库系列篇之基本概述
小学僧来啦
数据仓库 数据仓库 数据库 大数据
@Author:Spinach|GHB@Link:http://blog.csdn.net/bocai8058文章目录前言什么是数据仓库数据仓库与数据库的区别为什么要建立数据仓库及数仓平台的优势为什么要建立数据仓库大数据数仓平台的特点或优势数据仓库和数据集市的关系前言通过收集资料、个人经验总结整理了【数据仓库系列篇】,有不足之处多多包涵,可参考如下:《数据仓库系列篇之基本概述》《数据仓库系列篇之分
数据域VS主题域
陈吉俊
spark 大数据 分布式
数据域和主题域是数据仓库中两个重要的概念,他们在数据仓库建设和数据分析中扮演着不同的角色,两者有着明显的区别。数据域:以业务系统的角度,对业务过程进行归纳,抽象出来的数据域。它是自下而上的,通常在完成业务系统数据调研后就可以进行数据域的划分。数据域更侧重于从业务数据的角度进行划分,确保数据的完整性和准确性。主题域:从数据分析应用的角度进行划分的,通常是联系较为紧密的数据主题的集合。主题域是自上而下
MySQL数据库运维:深度解析与实践指南
野老杂谈
数据库 mysql 运维
欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏:+V:LAF20151116进行更多交流学习⭐️全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题.⭐️AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。⭐️全流程数据技术实战指南:全面讲解从数据采集到数据可视化的整个过程,掌握构建现代化数据平台和数据仓库的核心技术和方法。⭐
Hive的优势与使用场景
傲雪凌霜,松柏长青
后端 大数据 hive hadoop 数据仓库
Hive的优势Hive作为一个构建在Hadoop上的数据仓库工具,具有许多优势,特别是在处理大规模数据分析任务时。以下是Hive的主要优势:1.与Hadoop生态系统的紧密集成Hive构建在Hadoop分布式文件系统(HDFS)之上,能够处理海量数据并进行分布式计算。它利用Hadoop的MapReduce或Spark来执行查询,具备高度扩展性,适合大数据处理。2.支持SQL-like查询语言(Hi
大数据面试题:说下为什么要使用Hive?Hive的优缺点?Hive的作用是什么?
蓦然_
大数据面试题 hive 大数据开发面试题 大数据面试
1、为什么要使用Hive?Hive是Hadoop生态系统中比不可少的一个工具,它提供了一种SQL(结构化查询语言)方言,可以查询存储在Hadoop分布式文件系统(HDFS)中的数据或其他和Hadoop集成的文件系统,如MapR-FS、Amazon的S3和像HBase(Hadoop数据仓库)和Cassandra这样的数据库中的数据。大多数数据仓库应用程序都是使用关系数据库进行实现的,并使用SQL作为
hive序列生成_Hive实现自增列的两种方法
weixin_39559804
hive序列生成
多维数据仓库中的维度表和事实表一般都需要有一个代理键,作为这些表的主键,代理键一般由单列的自增数字序列构成。Hive没有关系数据库中的自增列,但它也有一些对自增序列的支持,通常有两种方法生成代理键:使用row_number()窗口函数或者使用一个名为UDFRowSequence的用户自定义函数(UDF)。用row_number()函数生成代理键INSERTOVERWRITETABLEmy_hive
数据仓库之【商品订单数据数仓】10:数据可视化工具:Zeppelin安装部署、Zeppelin使用
做一个有趣的人Zz
hadoop hive 数据仓库 hive big data
一、数据可视化数据可视化这块不是项目的重点,不过为了让大家能有一个更加直观的感受,我们可以选择一些现成的数据可视化工具实现。咱们前面分析过,想要查询hive中的数据可以使用hue,不过hue无法自动生成图表。所以我们可以考虑使用Zeppelin针对一些复杂的图表,可以选择定制开发,使用echarts、finebi组件实现。二、Zeppelin安装部署注意:不要使用Zeppelin0.8.2版本,这
关于Apache Hive 和 Apache Iceberg
[听得时光枕水眠]
apache hive hadoop
ApacheHive和ApacheIceberg都是大数据生态系统中的重要工具,但它们解决的问题和扮演的角色有所不同。我们可以用大白话来比喻它们之间的关系:ApacheHive可以想象成一个“数据仓库超市”,它的货架上摆满了各种商品(数据),并且提供了一个购物车(HiveQL,一种类SQL语言),让你可以方便地从这些商品中挑选你想要的,进行购买(查询)。Hive主要负责将Hadoop的数据组织成表
【GaussDB(DWS)】数仓部署架构与物理结构分析
若兰幽竹
GaussDB DWS gaussdb
数仓架构与物理结构分析一、部署架构二、物理结构三、测试验证一、部署架构华为数据仓库服务DWS,集群版本8.1.3.x集群拓扑结构:上述拓扑结构为DWS单AZ高可靠部署架构,为减少硬件故障对系统可用性的影响,建议集群部署方案遵循如下原则:对于每组实例,其主、备部署在不同的节点上。例如:GTM的主、备分别部署在不同的节点上。DN的主、备、从备部署在不同的节点上。建议节点内存大于等于512G,每个节点部
hive学习记录
2302_80695227
hive 学习 hadoop
一、Hive的基本概念定义:Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。Hive将HQL(HiveQueryLanguage)转化成MapReduce程序或其他分布式计算引擎(如Tez、Spark)的任务进行计算。数据存储:Hive处理的数据存储在HDFS(HadoopDistributedFileSystem)上。执行引擎:Hive的
06 | 学数据分析要掌握哪些基本概念?
张九日zx
商业智能BI、数据仓库DW、数据挖掘DM开头中的百货商店利用数据预测用户购物行为属于商业智能,他们积累的顾客的消费行为习惯会存储在数据仓库中,通过对个体进行消费行为分析总结出来的规律属于数据挖掘。元数据(MetaData):描述其它数据的数据,也称为“中介数据”。通过元数据,可以很方便地帮助我们管理数据仓库。数据元(DataElement):就是最小数据单元。数据挖掘:分类、聚类、预测和关联分析K
数仓分层架构:DWS
大连赵哥
大数据 大数据
在数据仓库的分层架构中,"DWS"通常指的是数据仓库的"服务层"或"汇总层",但这个缩写可能根据不同的上下文有不同的含义。以下是几种可能的解释:1.**数据仓库服务层(DataWarehouseServices)**:-在一些云服务提供商的数据平台中,DWS可能指的是提供数据仓库功能的一组服务,这些服务可能包括数据存储、管理和分析工具。2.**数据仓库星型模式(DataWarehouseStarS
阿里云日志服务sls的典型应用场景
阿里云天池
体验场景 云计算
日志服务的典型应用场景包括:数据采集与消费、数据清洗与流计算(ETL/StreamProcessing)、数据仓库对接(DataWarehouse)、日志实时查询与分析。云起实验室日志服务体验(活动期完成有机会参与100%中奖):https://developer.aliyun.com/adc/series/activity/sls-1数据采集与消费通过日志服务LogHub功能,可以大规模低成本接
Spring的注解积累
yijiesuifeng
spring 注解
用注解来向Spring容器注册Bean。
需要在applicationContext.xml中注册:
<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>。
如:在base-package指明一个包
<context:component-sc
传感器
百合不是茶
android 传感器
android传感器的作用主要就是来获取数据,根据得到的数据来触发某种事件
下面就以重力传感器为例;
1,在onCreate中获得传感器服务
private SensorManager sm;// 获得系统的服务
private Sensor sensor;// 创建传感器实例
@Override
protected void
[光磁与探测]金吕玉衣的意义
comsci
这是一个古代人的秘密:现在告诉大家
信不信由你们:
穿上金律玉衣的人,如果处于灵魂出窍的状态,可以飞到宇宙中去看星星
这就是为什么古代
精简的反序打印某个数
沐刃青蛟
打印
以前看到一些让求反序打印某个数的程序。
比如:输入123,输出321。
记得以前是告诉你是几位数的,当时就抓耳挠腮,完全没有思路。
似乎最后是用到%和/方法解决的。
而今突然想到一个简短的方法,就可以实现任意位数的反序打印(但是如果是首位数或者尾位数为0时就没有打印出来了)
代码如下:
long num, num1=0;
PHP:6种方法获取文件的扩展名
IT独行者
PHP 扩展名
PHP:6种方法获取文件的扩展名
1、字符串查找和截取的方法
1
$extension
=
substr
(
strrchr
(
$file
,
'.'
), 1);
2、字符串查找和截取的方法二
1
$extension
=
substr
面试111
文强chu
面试
1事务隔离级别有那些 ,事务特性是什么(问到一次)
2 spring aop 如何管理事务的,如何实现的。动态代理如何实现,jdk怎么实现动态代理的,ioc是怎么实现的,spring是单例还是多例,有那些初始化bean的方式,各有什么区别(经常问)
3 struts默认提供了那些拦截器 (一次)
4 过滤器和拦截器的区别 (频率也挺高)
5 final,finally final
XML的四种解析方式
小桔子
dom jdom dom4j sax
在平时工作中,难免会遇到把 XML 作为数据存储格式。面对目前种类繁多的解决方案,哪个最适合我们呢?在这篇文章中,我对这四种主流方案做一个不完全评测,仅仅针对遍历 XML 这块来测试,因为遍历 XML 是工作中使用最多的(至少我认为)。 预 备 测试环境: AMD 毒龙1.4G OC 1.5G、256M DDR333、Windows2000 Server
wordpress中常见的操作
aichenglong
中文注册 wordpress 移除菜单
1 wordpress中使用中文名注册解决办法
1)使用插件
2)修改wp源代码
进入到wp-include/formatting.php文件中找到
function sanitize_user( $username, $strict = false
小飞飞学管理-1
alafqq
管理
项目管理的下午题,其实就在提出问题(挑刺),分析问题,解决问题。
今天我随意看下10年上半年的第一题。主要就是项目经理的提拨和培养。
结合我自己经历写下心得
对于公司选拔和培养项目经理的制度有什么毛病呢?
1,公司考察,选拔项目经理,只关注技术能力,而很少或没有关注管理方面的经验,能力。
2,公司对项目经理缺乏必要的项目管理知识和技能方面的培训。
3,公司对项目经理的工作缺乏进行指
IO输入输出部分探讨
百合不是茶
IO
//文件处理 在处理文件输入输出时要引入java.IO这个包;
/*
1,运用File类对文件目录和属性进行操作
2,理解流,理解输入输出流的概念
3,使用字节/符流对文件进行读/写操作
4,了解标准的I/O
5,了解对象序列化
*/
//1,运用File类对文件目录和属性进行操作
//在工程中线创建一个text.txt
getElementById的用法
bijian1013
element
getElementById是通过Id来设置/返回HTML标签的属性及调用其事件与方法。用这个方法基本上可以控制页面所有标签,条件很简单,就是给每个标签分配一个ID号。
返回具有指定ID属性值的第一个对象的一个引用。
语法:
&n
励志经典语录
bijian1013
励志 人生
经典语录1:
哈佛有一个著名的理论:人的差别在于业余时间,而一个人的命运决定于晚上8点到10点之间。每晚抽出2个小时的时间用来阅读、进修、思考或参加有意的演讲、讨论,你会发现,你的人生正在发生改变,坚持数年之后,成功会向你招手。不要每天抱着QQ/MSN/游戏/电影/肥皂剧……奋斗到12点都舍不得休息,看就看一些励志的影视或者文章,不要当作消遣;学会思考人生,学会感悟人生
[MongoDB学习笔记三]MongoDB分片
bit1129
mongodb
MongoDB的副本集(Replica Set)一方面解决了数据的备份和数据的可靠性问题,另一方面也提升了数据的读写性能。MongoDB分片(Sharding)则解决了数据的扩容问题,MongoDB作为云计算时代的分布式数据库,大容量数据存储,高效并发的数据存取,自动容错等是MongoDB的关键指标。
本篇介绍MongoDB的切片(Sharding)
1.何时需要分片
&nbs
【Spark八十三】BlockManager在Spark中的使用场景
bit1129
manager
1. Broadcast变量的存储,在HttpBroadcast类中可以知道
2. RDD通过CacheManager存储RDD中的数据,CacheManager也是通过BlockManager进行存储的
3. ShuffleMapTask得到的结果数据,是通过FileShuffleBlockManager进行管理的,而FileShuffleBlockManager最终也是使用BlockMan
yum方式部署zabbix
ronin47
yum方式部署zabbix
安装网络yum库#rpm -ivh http://repo.zabbix.com/zabbix/2.4/rhel/6/x86_64/zabbix-release-2.4-1.el6.noarch.rpm 通过yum装mysql和zabbix调用的插件还有agent代理#yum install zabbix-server-mysql zabbix-web-mysql mysql-
Hibernate4和MySQL5.5自动创建表失败问题解决方法
byalias
J2EE Hibernate4
今天初学Hibernate4,了解了使用Hibernate的过程。大体分为4个步骤:
①创建hibernate.cfg.xml文件
②创建持久化对象
③创建*.hbm.xml映射文件
④编写hibernate相应代码
在第四步中,进行了单元测试,测试预期结果是hibernate自动帮助在数据库中创建数据表,结果JUnit单元测试没有问题,在控制台打印了创建数据表的SQL语句,但在数据库中
Netty源码学习-FrameDecoder
bylijinnan
java netty
Netty 3.x的user guide里FrameDecoder的例子,有几个疑问:
1.文档说:FrameDecoder calls decode method with an internally maintained cumulative buffer whenever new data is received.
为什么每次有新数据到达时,都会调用decode方法?
2.Dec
SQL行列转换方法
chicony
行列转换
create table tb(终端名称 varchar(10) , CEI分值 varchar(10) , 终端数量 int)
insert into tb values('三星' , '0-5' , 74)
insert into tb values('三星' , '10-15' , 83)
insert into tb values('苹果' , '0-5' , 93)
中文编码测试
ctrain
编码
循环打印转换编码
String[] codes = {
"iso-8859-1",
"utf-8",
"gbk",
"unicode"
};
for (int i = 0; i < codes.length; i++) {
for (int j
hive 客户端查询报堆内存溢出解决方法
daizj
hive 堆内存溢出
hive> select * from t_test where ds=20150323 limit 2;
OK
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
问题原因: hive堆内存默认为256M
这个问题的解决方法为:
修改/us
人有多大懒,才有多大闲 (评论『卓有成效的程序员』)
dcj3sjt126com
程序员
卓有成效的程序员给我的震撼很大,程序员作为特殊的群体,有的人可以这么懒, 懒到事情都交给机器去做 ,而有的人又可以那么勤奋,每天都孜孜不倦得做着重复单调的工作。
在看这本书之前,我属于勤奋的人,而看完这本书以后,我要努力变成懒惰的人。
不要在去庞大的开始菜单里面一项一项搜索自己的应用程序,也不要在自己的桌面上放置眼花缭乱的快捷图标
Eclipse简单有用的配置
dcj3sjt126com
eclipse
1、显示行号 Window -- Prefences -- General -- Editors -- Text Editors -- show line numbers
2、代码提示字符 Window ->Perferences,并依次展开 Java -> Editor -> Content Assist,最下面一栏 auto-Activation
在tomcat上面安装solr4.8.0全过程
eksliang
Solr solr4.0后的版本安装 solr4.8.0安装
转载请出自出处:
http://eksliang.iteye.com/blog/2096478
首先solr是一个基于java的web的应用,所以安装solr之前必须先安装JDK和tomcat,我这里就先省略安装tomcat和jdk了
第一步:当然是下载去官网上下载最新的solr版本,下载地址
Android APP通用型拒绝服务、漏洞分析报告
gg163
漏洞 android APP 分析
点评:记得曾经有段时间很多SRC平台被刷了大量APP本地拒绝服务漏洞,移动安全团队爱内测(ineice.com)发现了一个安卓客户端的通用型拒绝服务漏洞,来看看他们的详细分析吧。
0xr0ot和Xbalien交流所有可能导致应用拒绝服务的异常类型时,发现了一处通用的本地拒绝服务漏洞。该通用型本地拒绝服务可以造成大面积的app拒绝服务。
针对序列化对象而出现的拒绝服务主要
HoverTree项目已经实现分层
hvt
编程 .net Web C# ASP.ENT
HoverTree项目已经初步实现分层,源代码已经上传到 http://hovertree.codeplex.com请到SOURCE CODE查看。在本地用SQL Server 2008 数据库测试成功。数据库和表请参考:http://keleyi.com/a/bjae/ue6stb42.htmHoverTree是一个ASP.NET 开源项目,希望对你学习ASP.NET或者C#语言有帮助,如果你对
Google Maps API v3: Remove Markers 移除标记
天梯梦
google maps api
Simply do the following:
I. Declare a global variable:
var markersArray = [];
II. Define a function:
function clearOverlays() {
for (var i = 0; i < markersArray.length; i++ )
jQuery选择器总结
lq38366
jquery 选择器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
基础数据结构和算法六:Quick sort
sunwinner
Algorithm Quicksort
Quick sort is probably used more widely than any other. It is popular because it is not difficult to implement, works well for a variety of different kinds of input data, and is substantially faster t
如何让Flash不遮挡HTML div元素的技巧_HTML/Xhtml_网页制作
刘星宇
html Web
今天在写一个flash广告代码的时候,因为flash自带的链接,容易被当成弹出广告,所以做了一个div层放到flash上面,这样链接都是a触发的不会被拦截,但发现flash一直处于div层上面,原来flash需要加个参数才可以。
让flash置于DIV层之下的方法,让flash不挡住飘浮层或下拉菜单,让Flash不档住浮动对象或层的关键参数:wmode=opaque。
方法如下:
Mybatis实用Mapper SQL汇总示例
wdmcygah
sql mysql mybatis 实用
Mybatis作为一个非常好用的持久层框架,相关资料真的是少得可怜,所幸的是官方文档还算详细。本博文主要列举一些个人感觉比较常用的场景及相应的Mapper SQL写法,希望能够对大家有所帮助。
不少持久层框架对动态SQL的支持不足,在SQL需要动态拼接时非常苦恼,而Mybatis很好地解决了这个问题,算是框架的一大亮点。对于常见的场景,例如:批量插入/更新/删除,模糊查询,多条件查询,联表查询,