为spark中的现有RDD的增量更新生成唯一ID

时间:2018-01-04 18:13:03

标签: java scala apache-spark rdd transformation

我正在尝试使用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行。

0 个答案:

没有答案