88.Spark大型电商项目-用户访问session分析-数据倾斜解决方案之使用随机数以及扩容表进行joi

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/someby/article/details/88904157

目录

采用随机数和扩容表进行join

步骤

图示

局限性

代码示例


本篇文章记录用户访问session分析-数据倾斜解决方案之使用随机数以及扩容表进行join。

采用随机数和扩容表进行join

当采用此方案解决数据倾斜的时候,就代表着,你的之前的数据倾斜的解决方案,都没法使用。 这个方案是没办法彻底解决数据倾斜的,更多的,是一种对数据倾斜的缓解。 原理,其实在上一讲,已经带出来了。

步骤

 1、选择一个RDD,要用flatMap,进行扩容,将每条数据,映射为多条数据,每个映射出来的数据,都带了一个n以内的随机数,通常来说,会选择10。

2、将另外一个RDD,做普通的map映射操作,每条数据,都打上一个10以内的随机数。

3、最后,将两个处理后的RDD,进行join操作。 

扫描二维码关注公众号,回复: 5727139 查看本文章

图示

局限性

 1、因为两个RDD都很大,所以没有办法去将某一个RDD扩的特别大,一般就是10倍。

2、如果就是10倍的话,那么数据倾斜问题,的确是只能说是缓解和减轻,不能说彻底解决。
3、sample采样倾斜key并单独进行join :将key,从另外一个RDD中过滤出的数据,可能只有一条,或者几条,此时,可以任意进行扩容,扩成1000倍。 将从第一个RDD中拆分出来的那个倾斜key RDD,打上1000以内的一个随机数。 这种情况下,还可以配合上,提升shuffle reduce并行度,join(rdd, 1000)。通常情况下,效果还是非常不错的。 打散成100份,甚至1000份,2000份,去进行join,那么就肯定没有数据倾斜的问题了吧。

代码示例

       //使用随机数对userid2InfoRDD进行扩容
		JavaPairRDD<String, Row> expandedRDD = userid2InfoRDD.flatMapToPair(
				
				new PairFlatMapFunction<Tuple2<Long,Row>, String, Row>() {

					private static final long serialVersionUID = 1L;

					@Override
					public Iterable<Tuple2<String, Row>> call(Tuple2<Long, Row> tuple)
							throws Exception {
						List<Tuple2<String, Row>> list = new ArrayList<Tuple2<String, Row>>();
						
						for(int i = 0; i < 10; i++) {
							list.add(new Tuple2<String, Row>(i + "_" + tuple._1, tuple._2));
						}
						
						return list;
					}
					
				});

		//使用随机数对userid2PartAggrInfoRDD进行扩容
		
		JavaPairRDD<String, String> mappedRDD = userid2PartAggrInfoRDD.mapToPair(
				
				new PairFunction<Tuple2<Long,String>, String, String>() {

					private static final long serialVersionUID = 1L;

					@Override
					public Tuple2<String, String> call(Tuple2<Long, String> tuple)
							throws Exception {
						Random random = new Random();
						int prefix = random.nextInt(10);
						return new Tuple2<String, String>(prefix + "_" + tuple._1, tuple._2);  
					}
					
				});
		
		JavaPairRDD<String, Tuple2<String, Row>> joinedRDD = mappedRDD.join(expandedRDD);
		
		JavaPairRDD<String, String> finalRDD = joinedRDD.mapToPair(
				
				new PairFunction<Tuple2<String,Tuple2<String,Row>>, String, String>() {

					private static final long serialVersionUID = 1L;

					@Override
					public Tuple2<String, String> call(
							Tuple2<String, Tuple2<String, Row>> tuple)
							throws Exception {
						String partAggrInfo = tuple._2._1;
						Row userInfoRow = tuple._2._2;
						
						String sessionid = StringUtils.getFieldFromConcatString(
								partAggrInfo, "\\|", Constants.FIELD_SESSION_ID);
						
						int age = userInfoRow.getInt(3);
						String professional = userInfoRow.getString(4);
						String city = userInfoRow.getString(5);
						String sex = userInfoRow.getString(6);
						
						String fullAggrInfo = partAggrInfo + "|"
								+ Constants.FIELD_AGE + "=" + age + "|"
								+ Constants.FIELD_PROFESSIONAL + "=" + professional + "|"
								+ Constants.FIELD_CITY + "=" + city + "|"
								+ Constants.FIELD_SEX + "=" + sex;
						
						return new Tuple2<String, String>(sessionid, fullAggrInfo);
					}
					
				});

猜你喜欢

转载自blog.csdn.net/someby/article/details/88904157
今日推荐