【问题标题】:"java.lang.UnsupportedOperationException: empty collection"“java.lang.UnsupportedOperationException:空集合”
【发布时间】:2017-07-03 08:05:43
【问题描述】:

我正在使用 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()

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)

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

【问题讨论】:

  • 你能分享整个异常堆栈跟踪吗?
  • @stefanobaghino 我没有完整的堆栈跟踪。我收到 ...48 省略的消息。请让我知道如何得到整个东西
  • 所以你只得到一行写着java.lang.UnsupportedOperationException: empty collection?
  • @ stefanobaghino 我得到了这个:java.lang.UnsupportedOperationException: org.apache.spark.rdd.RDD$$anonfun$first$1.apply(RDD.scala:1370) at org. org.apache.spark.rdd.RDDOperationScope$.withScope(RDDOperationScope.scala:112) 在 org.apache.spark.rdd.RDD.withScope( RDD.scala:362) at org.apache.spark.rdd.RDD.first(RDD.scala:1367) ... 48 省略
  • 如果你有一个 csv 文件,为什么不使用 spark-csv 文件来读取文件?

标签: scala shell apache-spark


【解决方案1】:

您忘记trim 从分割线创建的元组中的空格,因此由于它们不匹配,因此没有加入任何内容。因此,当您从空的 rdd 尝试 take 时,会引发异常。

您可以使用以下解决方案。它在我的工作。

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)

【讨论】:

【解决方案2】:

join 之后会出现一个空集合,当 rdds 中现在有相应的键时会发生这种情况。要么没有修剪键,要么不正确地切片,要么根本没有任何匹配。我建议检查您的文件/rdds 中是否有匹配的键,检查数据是否正确提取并检查您是否需要inner join 而不是leftright outer join

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-26
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多