如何使用scala + spark比较两个rdds。?两个rdds都没有钥匙?

时间:2016-11-17 11:01:02

标签: scala apache-spark user-defined-functions rdd scala-collections

我想比较两个RDD中的数据。如何迭代和比较一个RDD中的字段数据与另一个RDD中的字段数据。以下Eg文件:`

File1 
 f1  f2       f3    f4    f5      f6  f7
 1 Nancyxyz 23456 12:30 NEWYORK 9000 xyz 
 2 ranboxys 12345 12:30 NEWYORK 9000 xyz

 File2
 f1  f2       f3    f4    f5      f6  f7
 2 ranboxys 12345 12:30 NEWYORK 9000 xyz
 1 markalan 23456 12:30 LONDON  7000 xyz 
 3 Loyleeie 45678 12:40 London  9001 abc

在上面,具有前2个记录的两个文件相同但顺序顺序不同。  现在我想比较rdds和print只有不同的记录,即

 File2
 3 Loyleeie 45678 12:40 London  9001 abc

我不想在两个rdds中获得前2条记录,因为两者都相同,但顺序不同  你能解释一下如何在scala中使用rdds

我尝试了减法和while循环等somany选项。但没有运气

我刚刚更改了“file2”第二条记录现在我要在file2和修改后的字段中打印第二条记录和第三条记录。我不知道哪个字段被更改,它只是比较file1如果不匹配则打印不同的记录并在另一行打印哪些字段被更改

1 个答案:

答案 0 :(得分:3)

假设File1File2类型为RDD[String],则以下操作将包含File2但不包含File1

中的所有元素
scala> val File1 = spark.sparkContext.textFile("File1.txt")

scala> val File2 = spark.sparkContext.textFile("File2.txt")

scala> File2.subtract(File1).collect
res0: Array[String] = Array(" 3 Loyleeie 45678 12:40 London  9001 abc")

此处name是字符串中的第二个字段(最初修剪空格)

scala> File2.subtract(File1).map { x => x.split(" ")(2) }.collect
res1: Array[String] = Array(Loyleeie)

如果tab是你的分隔符,请相应地替换它