左外链接(leftOuterJoin) spark实现

package com.kangaroo.studio.algorithms.join;

import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.PairFlatMapFunction;
import org.apache.spark.api.java.function.PairFunction;
import scala.Tuple2; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set; public class LeftOuterJoinSpark { private JavaSparkContext jsc;
private String usersInputFile;
private String transactionsInputFile; public LeftOuterJoinSpark(String usersInputFile, String transactionsInputFile) {
this.jsc = new JavaSparkContext();
this.usersInputFile = usersInputFile;
this.transactionsInputFile = transactionsInputFile;
} public void run() {
/*
* 读入users文件, 文件有两列, userId和location, 以制表符\t分割, 形如:
* u1 UT
* u2 GA
* u3 GA
* */
JavaRDD<String> users = jsc.textFile(usersInputFile, 1); /*
* 将字符串切分为kv对
* 输入: line字符串
* 输出: (userId, ("L", location)), 其中L标识这是一个location, 后面会有"P"标识这是一个product
* ("u1", ("L", "UT"))
* ("u2", ("L", "GA"))
* ("u3", ("L", "GA"))
* */
JavaPairRDD<String, Tuple2<String, String>> usersRDD = users.mapToPair(new PairFunction<String, String, Tuple2<String, String>>() {
public Tuple2<String, Tuple2<String, String>> call(String s) throws Exception {
String[] userRecord = s.split("\t");
String userId = userRecord[0];
Tuple2<String, String> location = new Tuple2<String, String>("L", userRecord[1]);
return new Tuple2<String, Tuple2<String, String>>(userId, location);
}
}); /*
* 读入transattion文件, 文件有4列, transactionIdproductId/userId/price, 以制表符\t分割
* t1 p3 u1 300
* t2 p1 u2 400
* t3 p1 u3 200
* */
JavaRDD<String> transactions = jsc.textFile(transactionsInputFile, 1); /*
* 将字符串切分为kv对
* 输入: line字符串
* 输出: (userId, ("P", productId)), "P"标识这是一个product
* ("u1", ("P", "p3"))
* ("u2", ("P", "p1"))
* ("u3", ("P", "p1"))
* */
JavaPairRDD<String, Tuple2<String, String>> transactionsRDD = transactions.mapToPair(new PairFunction<String, String, Tuple2<String, String>>() {
public Tuple2<String, Tuple2<String, String>> call(String s) throws Exception {
String[] transactionRecord = s.split("\t");
String userId = transactionRecord[2];
Tuple2<String, String> product = new Tuple2<String, String>("P", transactionRecord[1]);
return new Tuple2<String, Tuple2<String, String>>(userId, product);
}
}); /*
* 创建users和transaction的一个并集
* 输入:
* transaction ("u1", ("P", "p3"))
* users ("u1", ("L", "UT"))
* 输出:
* (userId, ("L", location))
* (userId, ("P", product))
* */
JavaPairRDD<String, Tuple2<String, String>> allRDD = transactionsRDD.union(usersRDD); /*
* 按照userId进行分组
* 输入:
* (userId, ("L", location))
* (userId, ("P", product))
* 输出:
* (userId, List[
* ("L", location),
* ("P", p1),
* ("P", p2),
* ... ])
* */
JavaPairRDD<String, Iterable<Tuple2<String, String>>> groupedRDD = allRDD.groupByKey(); /*
* 去掉userId, 行程location和product的配对
* 输入:
* (userId, List[
* ("L", location),
* ("P", p1),
* ("P", p2),
* ... ])
* 输出:
* (product1, location1)
* (product1, location2)
* (product2, location1)
* */
JavaPairRDD<String, String> productLocationRDD = groupedRDD.flatMapToPair(new PairFlatMapFunction<Tuple2<String, Iterable<Tuple2<String, String>>>, String, String>() {
public Iterable<Tuple2<String, String>> call(Tuple2<String, Iterable<Tuple2<String, String>>> s) throws Exception {
String userId = s._1;
Iterable<Tuple2<String, String>> pairs = s._2;
String location = "UNKNOWN";
List<String> products = new ArrayList<String>();
for (Tuple2<String, String> t2 : pairs) {
if (t2._1.equals("L")) {
location = t2._2;
} else if (t2._1.equals("P")){
products.add(t2._2);
}
}
List<Tuple2<String, String>> kvList = new ArrayList<Tuple2<String, String>>();
for (String product : products) {
kvList.add(new Tuple2<String, String>(product, location));
}
return kvList;
}
}); /*
* 以productId为key进行分组
* 输入:
* (product1, location1)
* (product1, location2)
* (product2, location1)
* 输出:
* (product1, List[
* location1,
* location2,
* ... ])
* */
JavaPairRDD<String, Iterable<String>> productByLocations = productLocationRDD.groupByKey(); /*
* 对location进行去重
* 输出:
* (product1, List[
* location1,
* location2,
* location2,
* ... ])
* 输出:
* (product1, List[
* location1,
* location2,
* ... ])
* */
JavaPairRDD<String, Tuple2<Set<String>, Integer>> productByUniqueLocations = productByLocations.mapValues(new Function<Iterable<String>, Tuple2<Set<String>, Integer>>() {
public Tuple2<Set<String>, Integer> call(Iterable<String> strings) throws Exception {
Set<String> uniqueLocations = new HashSet<String>();
for (String location : strings) {
uniqueLocations.add(location);
}
return new Tuple2<Set<String>, Integer>(uniqueLocations, uniqueLocations.size());
}
}); /*
* 打印结果
* */
List<Tuple2<String, Tuple2<Set<String>, Integer>>> result = productByUniqueLocations.collect();
for (Tuple2<String, Tuple2<Set<String>, Integer>> t : result) {
// productId
System.out.println(t._1);
// locationSet和size
System.out.println(t._2);
}
} public static void main(String[] args) {
String usersInputFile = args[0];
String transactionsInputFile = args[1];
LeftOuterJoinSpark leftOuterJoinSpark = new LeftOuterJoinSpark(usersInputFile, transactionsInputFile);
leftOuterJoinSpark.run();
}
}

大数据算法设计模式(2) - 左外链接(leftOuterJoin) spark实现的更多相关文章

  1. 大数据算法设计模式(1) - topN spark实现

    topN算法,spark实现 package com.kangaroo.studio.algorithms.topn; import org.apache.spark.api.java.JavaPai ...

  2. 大数据算法->推荐系统常用算法之基于内容的推荐系统算法

    港真,自己一直非常希望做算法工程师,所以自己现在开始对现在常用的大数据算法进行不断地学习,今天了解到的算法,就是我们生活中无处不在的推荐系统算法. 其实,向别人推荐商品是一个很常见的现象,比如我用了一 ...

  3. 滴滴大数据算法大赛Di-Tech2016参赛总结

    https://www.jianshu.com/p/4140be00d4e3 题目描述 建模方法 特征工程 我的几次提升方法 从其他队伍那里学习到的提升方法 总结和感想 神经网络方法的一点思考 大数据 ...

  4. MySQL☞左外链接与右外连接

    外链接查询:即要查询有关联关系的数据,还要查询没有关联关系的数据.(个人理解为:表A和表B两个关联的列中)如下图: emmm,简单的来说两个表的关联关系:book.bid=bookshop.id,他们 ...

  5. sql 三表左外链接的2种写法【原】

    初始化语句 DROP TABLE student; ) )); ','bobo'); ','sisi'); ','gugu'); ','mimi'); DROP TABLE room; ) ),roo ...

  6. 大数据与可靠性会碰撞出什么样的Spark?

    可靠性工程领域的可靠性评估,可靠性仿真计算,健康检测与预管理(PHM)技术,可靠性试验,都需要大规模数据来进行支撑才能产生好的效果,以往这些数据都是不全并且收集困难,而随着互联网+的大数据时代的来临, ...

  7. 大数据技术之_19_Spark学习_01_Spark 基础解析 + Spark 概述 + Spark 集群安装 + 执行 Spark 程序

    第1章 Spark 概述1.1 什么是 Spark1.2 Spark 特点1.3 Spark 的用户和用途第2章 Spark 集群安装2.1 集群角色2.2 机器准备2.3 下载 Spark 安装包2 ...

  8. 一文看懂大数据的技术生态Hadoop, hive,spark都有了[转]

    大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你可以把它比作一个厨房所以需要的各种工具.锅碗瓢盆,各有各的用处,互相之间又有重合.你可 ...

  9. 浅析大数据的技术生态圈(Hadoop,hive,spark)

    大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你可以把它比作一个厨房所以需要的各种工具.锅碗瓢盆,各有各的用处,互相之间又有重合.你可 ...

随机推荐

  1. 全平台轻量级 Verilog 编译器 & 仿真环境

    一直苦于 modelsim 没有Mac版本,且其体量过大,在学习verilog 时不方便使用. 终于找到一组轻量级且全平台 ( Linux+Windows+macOS ) 的编译仿真工具组. Icar ...

  2. 软工+C(2017第3期) 超链接

    // 上一篇:分数和checklist // 下一篇:Alpha/Beta换人 注:平常看文章,总有能和构建之法,软件工程相关的链接,增量记录,也可以通过在其他人博客的交流中使用相关的超链接,在使用中 ...

  3. python学习笔记1.1

  4. evak购物车-课程设计(201521123034陈凯欣)

    1.团队课程设计博客链接 https://i.cnblogs.com/EditPosts.aspx?postid=7047127 2.个人负责模块或任务说明 1.Java 编写商品类Goods,商品属 ...

  5. sed命令基础

    sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space ...

  6. C# 下搭建最新版OpenCV(Emgu CV)开发环境

    既然是"最新版" 首先当然是去sf找安装包: https://sourceforge.net/projects/emgucv/files/emgucv/ 或着去github主页上c ...

  7. 爬虫实战:爬虫之 web 自动化终极杀手 ( 上)

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:陈象 导语: 最近写了好几个简单的爬虫,踩了好几个深坑,在这里总结一下,给大家在编写爬虫时候能给点思路.本次爬虫内容有:静态页面的爬 ...

  8. 由一次自建库迁移到阿里云RDS引发的性能问题。

    刚入职一互联网公司,项目正好处于计划上线的时间,由于公司前不久已经购买了rds服务,领导决定尝试一番! 当然,新事物.云事物还是要谨慎的.安排我先把测试环境数据库迁移上去,这里吐槽一下,往rds迁移一 ...

  9. [js高手之路] html5 canvas系列教程 - arcTo(弧度与二次,三次贝塞尔曲线以及在线工具)

    之前,我写了一个arc函数的用法:[js高手之路] html5 canvas系列教程 - arc绘制曲线图形(曲线,弧线,圆形). arcTo: cxt.arcTo( cx, cy, x2, y2, ...

  10. taobao_api项目开坑,自主完成淘宝主要接口的开发-版本:卖家版(非淘宝api)

    项目名称:taobao_api 项目目的:独立实现各个淘宝操作的相关api,不依赖淘宝提供的api,而是自己实现接口 前期实现接口:已付款订单查询(自动更新), 订单发货 , 订单备注 应用场景:中小 ...