spark1.x升级到spark2.x以及1.x和2.x的版本兼容

本文介绍了从Spark 1.x迁移到2.x的方法,并通过一个示例展示了主要变化,即从Iterable到Iterator的转换。为解决版本兼容问题,文章还提供了一个自定义迭代器类来确保程序能在不同版本的Spark环境中运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. spark 1.x 升级到spark 2.x

对于普通的spark来说,变动不大 :

举一个最简单的实例:

spark1.x
public static JavaRDD<String> workJob(JavaRDD<String> spark1Rdd) {
		
		JavaPairRDD<String, Integer> testRdd = spark1Rdd
				.flatMapToPair(new PairFlatMapFunction<String, String, Integer>() {

			@Override
			public Iterable<Tuple2<String, Integer>> call(String str)
					throws Exception {
				ArrayList<Tuple2<String, Integer>> list = new ArrayList<>();
				return list;
				
			
			}
		});
				
		return spark1Rdd;
	}
spark2.x
public static JavaRDD<String> workJob(JavaRDD<String> spark2Rdd) {
		
		JavaPairRDD<String, Integer> testRdd2 = spark2Rdd
				.flatMapToPair(new PairFlatMapFunction<String, String, Integer>() {

			@Override
			public Iterator<Tuple2<String, Integer>> call(String str)
					throws Exception {
				ArrayList<Tuple2<String, Integer>> list = new ArrayList<>();
			

				return list.iterator();
			}
		});
		
		return spark2Rdd;
	}

需要说明的是:
上面的返回的rdd就直接用输入的 RDD显然是不合理的! 只是为了用最简洁的方式介绍代码的转换而已!

可以看到 : 区别主要在于
1. spark 1.x中的Iterable对象 变成了 spark2.x中的Iterator对象
2. 相应的,对于返回值为list的RDD,  spark2.x中要返回list.iterator();

还是很简单的吧

问题在于 : 如果你有几个spark程序要运行在不同的环境下,(有的现场用1.x,有的现场用2.x)
你需要同时维护两种不同版本的spark,是不是耗时又耗力呢?

这个时候就需要考虑到 spark版本的兼容性,使你的程序能成功的运行在各种集群环境下

2. spark版本的兼容

写一个简单的工具类如下 :

import java.util.Iterator;

public class MyIterator<T> implements Iterator, Iterable 
{
	private Iterator myIterable;

	public MyIterator(Iterable iterable)
	{
		myIterable = iterable.iterator();
	}

	@Override
	public boolean hasNext() 
	{
		return myIterable.hasNext();
	}

	@Override
	public Object next() 
	{
		return myIterable.next();
	}

	@Override
	public void remove() 
	{
		myIterable.remove();
	}

	@Override
	public Iterator iterator() 
	{
		return myIterable;
	}
}

只需要进行如上设计就可以实现版本的兼容了
那么应该如何应用呢?

 JavaRDD<String> flatMapRDD = lines.flatMap(new FlatMapFunction<String, String>() {
            @Override
            public MyIterator<String> call(String s) throws Exception {
                String[] split = s.split("\\s+");
                MyIterator myIterator = new MyIterator(Arrays.asList(split));
                return myIterator;
            }
});

**如上 **

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值