我正在使用Spark 2.1.1和Scala 2.11.8
我在Spark-shell中执行我的代码。这是我正在执行的代码
(( v67430612_serv78i, fb_201906266952256),1)
(( v74005958_serv35i, fb_128431994336303),1)
我输出的代码是:
uid2.map(x => ((x._1, x._2), x._3)).join(rdd1).map(y => ((y._1._1, y._1._2, y._2._1), y._2._2))
但是对于两个RDD的输出,当我执行时:
"java.lang.UnsupportedOperationException: empty collection"
我收到错误:
2017-05-09 21:52:42 , 1494391962 , p69465323_serv80i:10:450 , 7 , fb_406423006398063:396560, guest_861067032060185_android:671051, fb_100000829486587:186589, fb_100007900293502:407374, fb_172395756592775:649795
2017-05-09 21:52:42 , 1494391962 , z67265107_serv77i:4:45 , 2:Re , fb_106996523208498:110066, fb_274049626104849:86632, fb_111857069377742:69348, fb_127277511127344:46246
为什么我收到此错误?
以下是输入文件的示例: -
文件1:
fb_100008724660685,302502,-450,v300430479_serv73i:10:450,switchtable,2017-04-30 00:00:00
fb_190306964768414,147785,-6580,r308423810_serv31i::20,invite,2017-04-30 00:00:00
文件2:
rdd1.take(10).foreach(println) or rdd1.first()
我刚刚注意到这一点:当我执行时
WARN Executor: Managed memory leak detected; size = 39979424 bytes, TID = 11
我在输出之前也收到了这条消息:
res.first()
我不知道这可能与问题有什么关系?
另一个注意事项:此错误仅在我执行
时发生uid2.map(x => ((x._1, x._2), x._3)).join(rdd1).map(y => ((y._1._1, y._1._2, y._2._1), y._2._2))
代表
res.take(10).foreach(println)
在做
use open
我没有得到任何输出,但也没有返回错误。
答案 0 :(得分:2)
您忘记在分割行创建的元组中trim
空格,因此没有任何内容被加入,因为它们没有匹配。因此,当您从空take
尝试rdd
时,会抛出异常。
您可以使用以下解决方案。它在我的工作。
val read_file1 = sc.textFile("Path to file 1");
val uid = read_file1.map(line => line.split(",")).map(array => array.map(arr => {
if(arr.contains(":")) (array(2).split(":")(0).trim, arr.split(":")(0).trim)
else (array(2).split(":")(0).trim, arr.trim)}))
val rdd1 = uid.map(array => array.drop(4)).flatMap(array => array.toSeq).map(y=>(y,1)).reduceByKey(_+_)
val read_file2 = sc.textFile("Path to File 2");
val uid2 = read_file2.map(line => {var arr = line.split(","); (arr(3).split(":")(0).trim,arr(0).trim,arr(2).trim)});
val res = uid2.map(x => ((x._1, x._2), x._3)).join(rdd1).map(y => ((y._1._1, y._1._2, y._2._1), y._2._2))
res.take(10).foreach(println)
答案 1 :(得分:1)
在join
之后你得到一个空集合,它发生在rdds中现在有相应的键时。两个键都没有被修剪,切片不正确或根本没有任何匹配。我建议检查文件/ rdds中是否有匹配的密钥,检查数据是否正确提取并检查是否需要inner join
而不是left
或right outer join
。