Scala &引用;java.lang.UnsupportedOperationException:空集合;

Scala &引用;java.lang.UnsupportedOperationException:空集合;,scala,shell,apache-spark,Scala,Shell,Apache Spark,我正在使用Spark 2.1.1和Scala 2.11.8 我正在Spark shell中执行代码。这就是我正在执行的代码 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)

我正在使用Spark 2.1.1和Scala 2.11.8

我正在Spark shell中执行代码。这就是我正在执行的代码

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), arr.split(":")(0))
 |  else (array(2).split(":")(0), arr)}))

val rdd1 = uid.map(array => array.drop(4)).flatMap(array => array.toSeq).map(y=>(y,1)).reduceByKey(_+_)
我的代码输出是:

(( v67430612_serv78i, fb_201906266952256),1)
(( v74005958_serv35i, fb_128431994336303),1)
但是,对于两个RDD的输出,当我执行时:

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))
我得到一个错误:

 "java.lang.UnsupportedOperationException: empty collection" 
为什么我会犯这个错误

以下是输入文件的示例:-

文件1:

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
文件2:

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
我刚刚注意到:当我执行

rdd1.take(10).foreach(println) or rdd1.first()
在输出之前,我也收到了以下消息:

WARN Executor: Managed memory leak detected; size = 39979424 bytes, TID = 11
我不知道这是否与问题有关

另一个注意事项:只有当我这样做时,才会发生此错误

res.first()
为了

在做

res.take(10).foreach(println)

我没有得到任何输出,但也没有返回错误

您忘记了修剪从拆分行创建的元组中的空格,因此没有任何内容被合并,因为它们不匹配。所以,当您尝试从空的
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)

您忘记了修剪从拆分行创建的元组中的空格,因此没有任何内容被连接,因为它们不匹配。所以,当您尝试从空的
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)

在加入
之后,您会得到一个空集合,当RDD中现在有相应的键时,就会发生这种情况。关键帧未修剪、切片不正确或根本没有任何匹配项。我建议检查文件/RDD中是否有匹配的键,检查数据是否正确提取,检查是否需要
内部联接
,而不是
左侧联接
右侧外部联接
联接
之后,如果RDD中现在有相应的键,则会出现空集合。关键帧未修剪、切片不正确或根本没有任何匹配项。我建议检查您的文件/RDD中是否有匹配的键,检查数据是否正确提取,检查您是否需要
内部连接
,而不是
左侧连接
右侧外部连接

您可以共享整个异常堆栈跟踪吗?@stefanobaghino我没有整个堆栈跟踪。我收到了…48条省略的信息。请让我知道如何获取整个内容,这样你只会得到一行,上面写着
java.lang.UnsupportedOperationException:empty collection
?@stefanobaghino我得到这个:java.lang.UnsupportedOperationException:empty collection at org.apache.spark.rdd.rdd$$anonfun$first$1.apply(rdd.scala:1370)在org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)在org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)在org.apache.spark.rdd.rdd.withScope(rdd.scala:362)在org.apache.spark.rdd.rdd.rdd.rdd.first(rdd.scala:1367)。。。48 Elided如果您有一个csv文件,为什么不使用spark csv文件读取这些文件?您可以共享整个异常堆栈跟踪吗?@stefanobaghino我没有整个堆栈跟踪。我收到了…48条省略的信息。请让我知道如何获取整个内容,这样你只会得到一行,上面写着
java.lang.UnsupportedOperationException:empty collection
?@stefanobaghino我得到这个:java.lang.UnsupportedOperationException:empty collection at org.apache.spark.rdd.rdd$$anonfun$first$1.apply(rdd.scala:1370)在org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:151)在org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112)在org.apache.spark.rdd.rdd.withScope(rdd.scala:362)在org.apache.spark.rdd.rdd.rdd.rdd.first(rdd.scala:1367)。。。48 Elided如果你有一个csv文件,为什么不使用spark csv文件来读取这些文件?@Ramesh Maharjan文件的大小与此有关吗??因为问题仍然存在:(这里是这个@Ramesh Maharjan的截图链接文件的大小与此有关吗?)因为问题仍然存在:(这里是这个的截图链接