spark+Java代码案例集合:
这一章节大部分都是代码实例,spark中大部分常见的转换操作和行动操作
包含特定数据类型的RDD还支持的一些附加操作,
比如数字型的RDD支持的统计型函数操作.键值对RDD的聚合和键值操作等
史上最简单的spark教程
所有代码示例地址:https://github.com/Mydreamandreality/sparkResearch
(提前声明:文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章,写作不易,转载请注明)
(文章参考:Elasticsearch权威指南,Spark快速大数据分析文档,Elasticsearch官方文档,实际项目中的应用场景)
(帮到到您请点点关注,文章持续更新中!)
Git主页 https://github.com/Mydreamandreality
在上一章中的案例中,我们用到了filter()函数对日志进行筛选,做了转换操作,
然后又使用count()对筛选的日志进行聚合
而Spark 的大部分转化操作和一部分行动操作,都需要依赖用户传递的函数来计算.
这个是很好理解的,你需要发送指令,告诉Spark,我需要在这一堆杂乱的数据中,筛选哪些数据,生成怎么样的数据
所以在我们使用的filter()函数中,我们传入了一个匿名内部类的函数,
function
,
函数需要作为实现了Spar 的org.apache.spark.api.java.function
包中的任一函数接口的对象来传递
JavaRDD inputRDD = sparkContext.textFile("/usr/local/log");
JavaRDD errorRDD = inputRDD.filter(new Function() {
@Override
public Boolean call(String s) throws Exception {
return s.contains("error");
}
});
//定义具体类
class ContainsError implements Function{
@Override
public Boolean call(String v1) throws Exception {
return v1.contains("error");
}
}
JavaRDD errorRDD = inputRDD.filter(new ContainsErrorDev("Error"));
class ContainsErrorDev implements Function{
private String query;
public ContainsErrorDev(String query){
this.query = query;
}
public Boolean call(String v1) {
return v1.contains(query);
}
}
以上就是如何给转换操作函数传递函数的解释,下面就开始我们的案例集合
刚才说了,此处的案例有针对特定数据类型的RDD操作的,也有支持任意类型RDD的案例
那就先看下哪些转换操作和行动操作接受任意数据类型的RDD支持
/**
* 计算RDD中各值的平方
*/
public void map(JavaSparkContext sparkContext) {
//这里我们直接创建RDD
JavaRDD num = sparkContext.parallelize(Arrays.asList(1, 2, 3, 4, 5, 6));
//新生成的RDD元素
JavaRDD result = num.map(new Function() {
@Override
public Integer call(Integer v1) throws Exception {
return v1 * v1;
}
});
System.out.println(StringUtils.join(result.collect(),","));
}
/**
* flatMap分割字符串
*/
public void flatMap(JavaSparkContext sparkContext){
JavaRDD lines = sparkContext.parallelize(Arrays.asList("hello world", "hi"));
JavaRDD flatMapResult = lines.flatMap(new FlatMapFunction() {
@Override
public Iterator call(String s) throws Exception {
return Arrays.asList(PATTERN.split(s)).iterator();
}
});
flatMapResult.first();
//结果:hello
}
数据混洗:
RDD.distinct()
转化操作来生成一个只包含不同元素的新RDD集合操作:
案例:
操作数据
对数据{1, 2, 3}和{3, 4, 5}的RDD进行针对两个RDD的转化操作 [注意此处是两个RDD元素]
函数名 | 目的 | 示例 | 结果 |
---|---|---|---|
union() | 生成一个包含两个RDD中所有元素的RDD | RDD.union() | {1, 2, 3, 3, 4, 5} |
intersection() | 求两个 RDD 共同的元素的 RDD | RDD.intersection | {3} |
subtract() | 移除一个RDD中的内容 (比如训练数据) | RDD.subtract() | {1,2} |
JavaRDD rdd = sc.parallelize(Arrays.asList(1,2,3,4,5,6,7,8,9,10));
Integer sum =rdd.reduce(
new Function2() {
public Integercall(Integer v1, Integer v2) throws Exception {
return v1+v2;
}
}
);
System.out.println(sum.intValue());
//最后输出:55
/**
* Created by 張燿峰
* aggregate计算AVG
*
* @author 孤
* @date 2019/3/15
* @Varsion 1.0
*/
public class RddAvg {
private Integer total;
private Integer num;
public RddAvg(Integer total, Integer num) {
this.total = total;
this.num = num;
}
public double avg() {
return total / num;
}
Function2 avgFunction2 = new Function2() {
@Override
public RddAvg call(RddAvg v1, Integer v2) {
v1.total += v2;
v1.num += 1;
return v1;
}
};
Function2 rddAvgFunction2 = new Function2() {
@Override
public RddAvg call(RddAvg v1, RddAvg v2) {
v1.total += v2.total;
v1.num += v2.num;
return v1;
}
};
}
package spark;
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import java.util.Arrays;
/**
* Created by 張燿峰
* 测试Avg
*
* @author 孤
* @date 2019/3/15
* @Varsion 1.0
*/
public class Application {
public static void main(String[] args) {
rddAvg(new JavaSparkContext());
}
public static void rddAvg(JavaSparkContext sparkContext) {
JavaRDD javaRDD = sparkContext.parallelize(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
RddAvg rddAvg = new RddAvg(0, 0);
RddAvg result = javaRDD.aggregate(rddAvg, rddAvg.avgFunction2, rddAvg.rddAvgFunction2);
System.out.println(result.avg());
}
}
常用的案例我暂时先写了这么多,周六日抽空更新下Springboot和Elasticsearch分布式搜索的案例吧,
下周继续Spark的更新
有什么不懂的可以留言交流一波,
代码案例地址https://github.com/Mydreamandreality/sparkResearch