本文主要介绍spark join相关操作,Java描述。

讲述三个方法spark join,left-outer-join,right-outer-join

我们以实例来进行说明。我的实现步骤记录如下。

1、数据准备

2、HSQL描述

3、Spark描述

1、数据准备

我们准备两张Hive表,分别是orders(订单表)和drivers(司机表),通过driver_id字段进行关联。数据如下:

orders

  1. hive (gulfstream_test)> select * from orders;
  2. OK
  3. orders.order_id orders.driver_id
  4.  
  5. Time taken: row(s)

drivers

  1. hive (gulfstream_test)> select * from drivers;
  2. OK
  3. drivers.driver_id drivers.car_id
  4.  
  5. Time taken: row(s)

2、HSQL描述

JOIN

自然连接,输出连接键匹配的记录。

  1. hive (gulfstream_test)> select * from orders t1 join drivers t2 on (t1.driver_id = t2.driver_id) ;
  2. OK
  3. t1.order_id t1.driver_id t2.driver_id t2.car_id
  4.  
  5. Time taken: row(s)

LEFT OUTER JOIN

左外链接,输出连接键匹配的记录,左侧的表无论匹配与否都输出。

  1. hive (gulfstream_test)> select * from orders t1 left outer join drivers t2 on (t1.driver_id = t2.driver_id) ;
  2. OK
  3. t1.order_id t1.driver_id t2.driver_id t2.car_id
  4.  
  5. NULL NULL
  6. NULL NULL
  7. Time taken: row(s)

RIGHT OUTER JOIN

右外连接,输出连接键匹配的记录,右侧的表无论匹配与否都输出。

  1. hive (gulfstream_test)> select * from orders t1 right outer join drivers t2 on (t1.driver_id = t2.driver_id) ;
  2. OK
  3. t1.order_id t1.driver_id t2.driver_id t2.car_id
  4.  
  5. Time taken: row(s)

3、Spark描述

Join.java

spark实现join的方式也是通过RDD的算子,spark同样提供了三个算子join,leftOuterJoin,rightOuterJoin。

在下面给出的例子中,我们通过spark-hive读取了Hive表中的数据,并将DataFrame转化成了RDD。

在join之后,通过collect()函数把数据拉到Driver端本地,并通过标准输出打印。

需要指出的是:

1)join算子(join,leftOuterJoin,rightOuterJoin)只能通过PairRDD使用;

2)join算子操作的Tuple2<Object1, Object2>类型中,Object1是连接键,我只试过Integer和String,Object2比较灵活,甚至可以是整个Row。

  1. package com.kangaroo.studio.algorithms.join;
  2.  
  3. import com.google.common.base.Optional;
  4. import org.apache.spark.SparkConf;
  5. import org.apache.spark.api.java.JavaPairRDD;
  6. import org.apache.spark.api.java.JavaSparkContext;
  7. import org.apache.spark.api.java.function.PairFunction;
  8. import org.apache.spark.sql.DataFrame;
  9. import org.apache.spark.sql.Row;
  10. import org.apache.spark.sql.hive.HiveContext;
  11. import scala.Tuple2;
  12.  
  13. import java.io.Serializable;
  14. import java.util.Iterator;
  15.  
  16. /*
  17. * spark-submit --queue=root.zhiliangbu_prod_datamonitor spark-join-1.0-SNAPSHOT-jar-with-dependencies.jar
  18. * */
  19. public class Join implements Serializable {
  20.  
  21. private transient JavaSparkContext javaSparkContext;
  22. private transient HiveContext hiveContext;
  23.  
  24. /*
  25. * 初始化Load
  26. * 创建sparkContext, sqlContext, hiveContext
  27. * */
  28. public Join() {
  29. initSparckContext();
  30. initHiveContext();
  31. }
  32.  
  33. /*
  34. * 创建sparkContext
  35. * */
  36. private void initSparckContext() {
  37. String warehouseLocation = System.getProperty("user.dir");
  38. SparkConf sparkConf = new SparkConf()
  39. .setAppName("spark-join")
  40. .set("spark.sql.warehouse.dir", warehouseLocation)
  41. .setMaster("yarn-client");
  42. javaSparkContext = new JavaSparkContext(sparkConf);
  43. }
  44.  
  45. /*
  46. * 创建hiveContext
  47. * 用于读取Hive中的数据
  48. * */
  49. private void initHiveContext() {
  50. hiveContext = new HiveContext(javaSparkContext);
  51. }
  52.  
  53. public void join() {
  54. /*
  55. * 生成rdd1
  56. * */
  57. String query1 = "select * from gulfstream_test.orders";
  58. DataFrame rows1 = hiveContext.sql(query1).select("order_id", "driver_id");
  59. JavaPairRDD<String, String> rdd1 = rows1.toJavaRDD().mapToPair(new PairFunction<Row, String, String>() {
  60. @Override
  61. public Tuple2<String, String> call(Row row) throws Exception {
  62. String orderId = (String)row.get(0);
  63. String driverId = (String)row.get(1);
  64. return new Tuple2<String, String>(driverId, orderId);
  65. }
  66. });
  67. /*
  68. * 生成rdd2
  69. * */
  70. String query2 = "select * from gulfstream_test.drivers";
  71. DataFrame rows2 = hiveContext.sql(query2).select("driver_id", "car_id");
  72. JavaPairRDD<String, String> rdd2 = rows2.toJavaRDD().mapToPair(new PairFunction<Row, String, String>() {
  73. @Override
  74. public Tuple2<String, String> call(Row row) throws Exception {
  75. String driverId = (String)row.get(0);
  76. String carId = (String)row.get(1);
  77. return new Tuple2<String, String>(driverId, carId);
  78. }
  79. });
  80. /*
  81. * join
  82. * */
  83. System.out.println(" ****************** join *******************");
  84. JavaPairRDD<String, Tuple2<String, String>> joinRdd = rdd1.join(rdd2);
  85. Iterator<Tuple2<String, Tuple2<String, String>>> it1 = joinRdd.collect().iterator();
  86. while (it1.hasNext()) {
  87. Tuple2<String, Tuple2<String, String>> item = it1.next();
  88. System.out.println("driver_id:" + item._1 + ", order_id:" + item._2._1 + ", car_id:" + item._2._2 );
  89. }
  90.  
  91. /*
  92. * leftOuterJoin
  93. * */
  94. System.out.println(" ****************** leftOuterJoin *******************");
  95. JavaPairRDD<String, Tuple2<String, Optional<String>>> leftOuterJoinRdd = rdd1.leftOuterJoin(rdd2);
  96. Iterator<Tuple2<String, Tuple2<String, Optional<String>>>> it2 = leftOuterJoinRdd.collect().iterator();
  97. while (it2.hasNext()) {
  98. Tuple2<String, Tuple2<String, Optional<String>>> item = it2.next();
  99. System.out.println("driver_id:" + item._1 + ", order_id:" + item._2._1 + ", car_id:" + item._2._2 );
  100. }
  101.  
  102. /*
  103. * rightOuterJoin
  104. * */
  105. System.out.println(" ****************** rightOuterJoin *******************");
  106. JavaPairRDD<String, Tuple2<Optional<String>, String>> rightOuterJoinRdd = rdd1.rightOuterJoin(rdd2);
  107. Iterator<Tuple2<String, Tuple2<Optional<String>, String>>> it3 = rightOuterJoinRdd.collect().iterator();
  108. while (it3.hasNext()) {
  109. Tuple2<String, Tuple2<Optional<String>, String>> item = it3.next();
  110. System.out.println("driver_id:" + item._1 + ", order_id:" + item._2._1 + ", car_id:" + item._2._2 );
  111. }
  112. }
  113.  
  114. public static void main(String[] args) {
  115. Join sj = new Join();
  116. sj.join();
  117. }
  118.  
  119. }

pom.xml

pom依赖

这里只依赖spark-core和spark-hive两个jar。

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.apache.spark</groupId>
  4. <artifactId>spark-core_2.10</artifactId>
  5. <version>1.6.0</version>
  6. <scope>provided</scope>
  7. </dependency>
  8. <dependency>
  9. <groupId>org.apache.spark</groupId>
  10. <artifactId>spark-hive_2.10</artifactId>
  11. <version>1.6.0</version>
  12. <scope>provided</scope>
  13. </dependency>
  14. </dependencies>

打包方式

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <artifactId>maven-assembly-plugin</artifactId>
  5. <configuration>
  6. <archive>
  7. <manifest>
  8. <!--这里要替换成jar包main方法所在类 -->
  9. <mainClass>com.kangaroo.studio.algorithms.join.Join</mainClass>
  10. </manifest>
  11. </archive>
  12. <descriptorRefs>
  13. <descriptorRef>jar-with-dependencies</descriptorRef>
  14. </descriptorRefs>
  15. </configuration>
  16. <executions>
  17. <execution>
  18. <id>make-assembly</id> <!-- this is used for inheritance merges -->
  19. <phase>package</phase> <!-- 指定在打包节点执行jar包合并操作 -->
  20. <goals>
  21. <goal>single</goal>
  22. </goals>
  23. </execution>
  24. </executions>
  25. </plugin>
  26. <plugin>
  27. <groupId>org.apache.maven.plugins</groupId>
  28. <artifactId>maven-compiler-plugin</artifactId>
  29. <configuration>
  30. <source>1.6</source>
  31. <target>1.6</target>
  32. </configuration>
  33. </plugin>
  34. </plugins>
  35. </build>

执行结果

其中Optional.absent()表示的就是null,可以看到和HSQL是一致的。

  1. Application ID is application_1508228032068_2746260, trackingURL: http://10.93.21.21:4040
  2. ****************** join *******************
  3. driver_id:, order_id:, car_id:
  4. ****************** leftOuterJoin *******************
  5. driver_id:, order_id:, car_id:Optional.absent()
  6. driver_id:, order_id:, car_id:Optional.absent()
  7. driver_id:, order_id:, car_id:Optional.of()
  8. ****************** rightOuterJoin *******************
  9. driver_id:, order_id:Optional.absent(), car_id:
  10. driver_id:, order_id:Optional.of(), car_id:

spark join操作解读的更多相关文章

  1. 大数据计算平台Spark内核全面解读

    1.Spark介绍 Spark是起源于美国加州大学伯克利分校AMPLab的大数据计算平台,在2010年开源,目前是Apache软件基金会的顶级项目.随着Spark在大数据计算领域的暂露头角,越来越多的 ...

  2. 大数据开发-Spark Join原理详解

    数据分析中将两个数据集进行 Join 操作是很常见的场景.在 Spark 的物理计划阶段,Spark 的 Join Selection 类会根 据 Join hints 策略.Join 表的大小. J ...

  3. 使用MapReduce实现join操作

     在关系型数据库中,要实现join操作是非常方便的,通过sql定义的join原语就可以实现.在hdfs存储的海量数据中,要实现join操作,可以通过HiveQL很方便地实现.不过HiveQL也是转化成 ...

  4. 使用 Linq 对多个对象进行join操作 C#

    class A { public int id { get; set; } public string name { get; set; } } class B { public int id { g ...

  5. MapReduce 实现数据join操作

    前段时间有一个业务需求,要在外网商品(TOPB2C)信息中加入 联营自营 识别的字段.但存在的一个问题是,商品信息 和 自营联营标示数据是 两份数据:商品信息较大,是存放在hbase中.他们之前唯一的 ...

  6. Spark RDD/Core 编程 API入门系列之动手实战和调试Spark文件操作、动手实战操作搜狗日志文件、搜狗日志文件深入实战(二)

    1.动手实战和调试Spark文件操作 这里,我以指定executor-memory参数的方式,启动spark-shell. 启动hadoop集群 spark@SparkSingleNode:/usr/ ...

  7. 重温sql语句中的join操作

    1.join语句 Sql join语句用来合并两个或多个表中的记录.ANSI标准SQL语句中有四种JOIN:INNER,OUTER,LEFTER,RIGHT,一个表或视图也可以可以和它自身做JOIN操 ...

  8. SQL点滴2—重温sql语句中的join操作

    原文:SQL点滴2-重温sql语句中的join操作 1.join语句 Sql join语句用来合并两个或多个表中的记录.ANSI标准SQL语句中有四种JOIN:INNER,OUTER,LEFTER,R ...

  9. hive:join操作

    hive的多表连接,都会转换成多个MR job,每一个MR job在hive中均称为Join阶段.按照join程序最后一个表应该尽量是大表,因为join前一阶段生成的数据会存在于Reducer 的bu ...

随机推荐

  1. Spring c3p0连接池无法释放解决方案

    通过c3p0配置连接池的时候,在进行压力测试的时候,日志出现了这样一个错误:Data source rejected establishment of connection, message from ...

  2. HDFS概述(3)————HDFS Federation

    本指南概述了HDFS Federation功能以及如何配置和管理联合集群. 当前HDFS背景 HDFS主要有两层: 1.Namespace (1)包含目录,文件和块. (2)它支持所有命名空间相关的文 ...

  3. centos 6.5系统下安装ibus及设置开机自启动

    先说一下系统环境:centos 6.5,然后我是以root身份执行的,没有权限的用户参见sudo用法 第1步:查找并安装ibus安装包,命令如下: 找到一行: ibus-pinyin.x86_64 : ...

  4. 使用LayUI展示数据

    LayUI是一款免费,开源,轻量级的前端cms框架,适用于企业后端,能快速上手开发,集成了常用的组件,还有完善的文档和社区. 点击查看 文档地址 下载框架 使用: 1.把这个5个文件项都拷贝到项目中 ...

  5. 分享基于分布式Http长连接框架

    第一次在博客园写文章,长期以来只是潜水中.本着不只索取,而要奉献的精神,随笔文章之. 现贡献一套长连接的框架.如下特性: 1:发布者可异步发送消息,消息如果发送失败,可重试发送,重试次数基于配置,消息 ...

  6. hadoop(二)搭建伪分布式集群

    前言 前面只是大概介绍了一下Hadoop,现在就开始搭建集群了.我们下尝试一下搭建一个最简单的集群.之后为什么要这样搭建会慢慢的分享,先要看一下效果吧! 一.Hadoop的三种运行模式(启动模式) 1 ...

  7. Python面试题之copy/deepcopy详解

    copy和deepcopy有什么区别? http://blog.csdn.net/qq_32907349/article/details/52190796 http://iaman.actor/blo ...

  8. C#设计模式之七适配器模式(Adapter)【结构型】

    一.引言   从今天开始我们开始讲[结构型]设计模式,[结构型]设计模式有如下几种:适配器模式.桥接模式.装饰模式.组合模式.外观模式.享元模式.代理模式.[创建型]的设计模式解决的是对象创建的问题, ...

  9. dom4j之小小工具

    dom4j经常不用,方法忘了又记,故做出读取xml和把document写入xml的小小工具~~~ /** * 读取document和将document对象写入到xml的小工具 * 使用该类必须给出do ...

  10. 使用MxNet新接口Gluon提供的预训练模型进行微调

    1. 导入各种包 from mxnet import gluon import mxnet as mx from mxnet.gluon import nn from mxnet import nda ...