我正在尝试使用spark中的 union 对我的RDD进行增量更新。为此,我有RDD1(已经存在)。
RDD1:
JavaPairRDD<String,String>(uniqueID,data)
其中第一个String对应于“UniqueID”,第二个String是数据。
RDD1数据:
1000000000006873 | A,B,C,d
1000000000009843 | E,F,G
1000000000005823 | H,G,J
1000000000001870 | ž,K
在我的增量过程中生成RDD2。
RDD2:
JavaRDD<String>(data)
这里String对应于数据。
RDD2数据:
的x,y
S,C,F
Q,R,T,Z,L
我正在尝试将RDD2转换为JavaPairRDD,其中第一个String对应于“uniqueId”。这样我最终可以将这个新生成的RDD2联合到RDD1。
为此,我能够将RDD2转换为pairRDD,但是如何确保我为RDD2的每一行生成的uniqueID不会出现在RDD1中。
基本上我想为RDD2中的每一行生成唯一ID(密钥),这样在RDD1中就不会出现这个唯一ID。
预期输出
1000000000007765 | X,Y
1000000000001190 | S,C,F
1000000000023467 | Q,R,T,Z,L
代码更新:
JavaPairRDD<String,String> RDD1 = sc.textFile(args[0]).mapToPair(x->{
String[] tokens = x.split(",");
return new Tuple2<String,String>(tokens[0],tokens[1]); // here tokens[0] is key and tokens[1] is my data
}).persist(StorageLevel.MEMORY_AND_DISK());
// RDD2 generated here
JavaPairRDD<String, String> RDD2_ZippedwithUniqueID =RDD2.zipWithUniqueId().mapToPair(x -> {
String key = generateKey(x._2(), "1", 16); // method i am using to generate 16 digit fixed ID beginning with "1"
return new Tuple2<String, String>(key, x._1);
}).persist(StorageLevel.MEMORY_AND_DISK());
现在如何确保我在rdd“RDD2_ZippedwithUniqueID”中生成的密钥不会出现在RDD1中。我以前使用相同的方法在RDD1中生成密钥(即使用zipwithUniqueID和generateKey方法)
JavaPairRDD<String,String> finalOutput = RDD1.union(RDD2_ZippedwithUniqueID);
因为在做“RDD1”和“”RDD2_ZippedwithUniqueID“的联合时,我想确保所有键都是唯一的。
RDD1有大约1.25亿行,而RDD2有5000行。