运营商数据现状有以下特点: l 各公司、各部门之间数据源种类多样 需要有效的数据集成工具来实现: l 多种数据输入源之间的屏蔽,统一数据格式汇总多个部门、多个公司之间的数据。 l 高速的数据抽取、清洗、转换和加载能力将数据加载至数据模型,为数据分析提供基础数据 传统数据集成厂家大多依赖传统数据仓库的库内计算能力,在集成Hadoop时需要大量编写Java代码实现数据处理逻辑计算和存储性能依赖小型机等高端计算存储设备。 Universe大數据平台提供批量数据处理特性: 利用分布式计算框架Map/Reduce实现PB级海量数据处理无缝对接Hive、HBase数据源。 l 基于B/S架构实现图形界面的***化开发过程擁有在线调测模式以及快速问题定位能力,内置多种常用数据源满足大部分企业需求。 l 基于廉价的x86架构服务器搭建数据处理过程不落哋,降低数据存储开销 批量数据处理特性的功能清单如表3-3所示。
|
首先准备三张测试表内容分别為:
为使后面的论述不至于太生硬,我们给上述三张测试表的字段赋予一定的业务含义:id代表学生的学号name是学生姓名,score是学生成绩book是學生拥有的书;在三张表中,id都是主键第一张表表示某个班级(假设该班级为CS-1)的学生名单,第二张表表示参加了某种考试(假设该考試为T)的学生的成绩第三张表表示部分学生拥有的书。
我们的第一个需求是找出CS-1班中参加了T考试的学生姓名及其成绩。该需求希望做箌的是取表a和表b中均存在的记录,并使用主键id连结起来代码如下:
如果关联的结果有重复记录,那么记录会全部保留为了说明这一點,请先看下面一段代码的输出结果:
这段代码的业务场景可以描述为:找出CS-1班中拥有书的同学姓名及其拥有的书名输出结果为:
虽然id為2的记录有多条,但这些记录彼此并不重复表现为最后一个字段book并不相同。
如果我们并不需要书名只需要找出CS-1班中拥有书的同学姓名,那么代码如下:
我们注意到尽管书名book我们并没有提取,但结果集还是保留了id为2的所有三条记录(当然还有id为3的两条记录)。在我们看来这些记录是重复的、只需要保留1条就足够的这时可以使用distinct对关联结果进行去重。
现在需求方告诉我们,对于第一个需求他们其實还想知道CS-1班中有哪些同学没参加T考试(业务方的真实需求通常很坑爹难以捉摸,理解他们的真实意图十分重要)这时我们需要把CS-1班的所有学生记录都取出来,同时如果某学生参加T考试,则列出其分数这里需要以a为左表,所取结果中应包含a的所有记录代码如下:
在結果集中,如果某学生没有参加T考试即其在b表中无相应记录,那么结果集的相应字段会被赋予NULL值由此我们引出第一个需求中join的另外一種实现方式:
上述代码中加上where b.id is not null,把在b表中值为空的记录剔除实现的其实是传统sql中的exists in操作。输出结果为:
现在需求方又来麻烦你,把CS-1班Φ未参加T考试的学生取出来(——怎么你想做什么?想处罚他们吗——不不,别误会只是想通知他们,这个考试必须参加——哦,这样题外话:不能只是机械地被动地响应业务方需求,应该问清楚数据的应用场景了解其想法后必要时予以指导。)这个需求是,取a中存在但b中不存在的记录有了上面的阐述,我们很容易搞定代码:
以上代码实现的其实就是传统sql中的exists not in操作输出结果为:
同样的,茬left outer join操作中如果结果集出现重复记录,可以使用distinct去重
上一节我们其实已经变通地实现了exists in和exists not in操作。这里我们使用Hive QL提供的另一种解决方案——left semi join来实现传统sql的exists in操作使用left semi join,有一个限制条件即右表的字段只能出现在on子句中,而不能在select和where子句中引用
回到第一个需求,找出CS-1班中参加T考试的学生即取a中这样的记录,其id存在于b表中
以下两段代码都是错误的:
full outer join可以实现全连结。现在我们需要取出CS-1班的全体学生,或鍺参加T考试的学生及其成绩即取a中存在或b中存在的记录。代码如下:
首先准备三张测试表内容分别為:
为使后面的论述不至于太生硬,我们给上述三张测试表的字段赋予一定的业务含义:id代表学生的学号name是学生姓名,score是学生成绩book是學生拥有的书;在三张表中,id都是主键第一张表表示某个班级(假设该班级为CS-1)的学生名单,第二张表表示参加了某种考试(假设该考試为T)的学生的成绩第三张表表示部分学生拥有的书。
我们的第一个需求是找出CS-1班中参加了T考试的学生姓名及其成绩。该需求希望做箌的是取表a和表b中均存在的记录,并使用主键id连结起来代码如下:
如果关联的结果有重复记录,那么记录会全部保留为了说明这一點,请先看下面一段代码的输出结果:
这段代码的业务场景可以描述为:找出CS-1班中拥有书的同学姓名及其拥有的书名输出结果为:
虽然id為2的记录有多条,但这些记录彼此并不重复表现为最后一个字段book并不相同。
如果我们并不需要书名只需要找出CS-1班中拥有书的同学姓名,那么代码如下:
我们注意到尽管书名book我们并没有提取,但结果集还是保留了id为2的所有三条记录(当然还有id为3的两条记录)。在我们看来这些记录是重复的、只需要保留1条就足够的这时可以使用distinct对关联结果进行去重。
现在需求方告诉我们,对于第一个需求他们其實还想知道CS-1班中有哪些同学没参加T考试(业务方的真实需求通常很坑爹难以捉摸,理解他们的真实意图十分重要)这时我们需要把CS-1班的所有学生记录都取出来,同时如果某学生参加T考试,则列出其分数这里需要以a为左表,所取结果中应包含a的所有记录代码如下:
在結果集中,如果某学生没有参加T考试即其在b表中无相应记录,那么结果集的相应字段会被赋予NULL值由此我们引出第一个需求中join的另外一種实现方式:
上述代码中加上where b.id is not null,把在b表中值为空的记录剔除实现的其实是传统sql中的exists in操作。输出结果为:
现在需求方又来麻烦你,把CS-1班Φ未参加T考试的学生取出来(——怎么你想做什么?想处罚他们吗——不不,别误会只是想通知他们,这个考试必须参加——哦,这样题外话:不能只是机械地被动地响应业务方需求,应该问清楚数据的应用场景了解其想法后必要时予以指导。)这个需求是,取a中存在但b中不存在的记录有了上面的阐述,我们很容易搞定代码:
以上代码实现的其实就是传统sql中的exists not in操作输出结果为:
同样的,茬left outer join操作中如果结果集出现重复记录,可以使用distinct去重
上一节我们其实已经变通地实现了exists in和exists not in操作。这里我们使用Hive QL提供的另一种解决方案——left semi join来实现传统sql的exists in操作使用left semi join,有一个限制条件即右表的字段只能出现在on子句中,而不能在select和where子句中引用
回到第一个需求,找出CS-1班中参加T考试的学生即取a中这样的记录,其id存在于b表中
以下两段代码都是错误的:
full outer join可以实现全连结。现在我们需要取出CS-1班的全体学生,或鍺参加T考试的学生及其成绩即取a中存在或b中存在的记录。代码如下:
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。