【发布时间】:2018-07-26 19:40:14
【问题描述】:
我试图找到单词的共现。以下是我正在使用的代码。
val dataset = df.select("entity").rdd.map(row => row.getList(0)).filter(r => r.size() > 0).distinct()
println("dataset")
dataset.take(10).foreach(println)
示例数据集
dataset
[aa]
[bb]
[cc]
[dd]
[ee]
[ab, ac, ad]
[ff]
[ef, fg]
[ab, gg, hh]
代码片段
case class tupleIn(a: String,b: String)
case class tupleOut(i: tupleIn, c: Long)
val cooccurMapping = dataset.flatMap(
list => {
list.toArray().map(e => e.asInstanceOf[String].toLowerCase).flatMap(
ele1 => {
list.toArray().map(e => e.asInstanceOf[String].toLowerCase).map(ele2 => {
if (ele1 != ele2) {
((ele1, ele2), 1L)
}
})
})
})
如何从中过滤?
我试过了
.filter(e => e.isInstanceOf[Tuple2[(String, String), Long]])
:121: 警告:无果类型测试:Unit 类型的值也不能是 ((String, String), Long) .filter(e => e.isInstanceOf[Tuple2[(String, String), Long]]) ^
:121: 错误:isInstanceOf 无法测试值类型是否为引用。 .filter(e => e.isInstanceOf[Tuple2[(String, String), Long]])
.filter(e => e.isInstanceOf[tupleOut])
:122: 警告:无果类型测试:单元类型的值 也不能是 coocrTupleOut .filter(e => e.isInstanceOf[tupleOut]) ^ :122: 错误:isInstanceOf 无法测试值类型是否为引用。 .filter(e => e.isInstanceOf[tupleOut])
如果我映射
.map(e => e.asInstanceOf[Tuple2[(String, String), Long]])
上面的 sn-p 工作正常,但一段时间后会出现此异常:
java.lang.ClassCastException: scala.runtime.BoxedUnit 不能被强制转换 到 scala.Tuple2 在 $line84834447093.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw $$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$anonfun$2$$anonfun$9.apply( :123) 在 $line84834447093.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw $$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$anonfun$2$$anonfun$9.apply( :123) 在 scala.collection.Iterator$$anon$11.next(Iterator.scala:409) 在 scala.collection.Iterator$$anon$13.hasNext(Iterator.scala:462) 在 org.apache.spark.util.collection.ExternalSorter.insertAll(ExternalSorter.scala:191) 在 org.apache.spark.shuffle.sort.SortShuffleWriter.write(SortShuffleWriter.scala:63) 在 org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:96) 在 org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:53) 在 org.apache.spark.scheduler.Task.run(Task.scala:108) 在 org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:338) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 在 java.lang.Thread.run(Thread.java:748)
为什么instanceOf 不在filter() 工作,但在map() 工作
【问题讨论】:
-
你想在这里实现什么?这看起来像XY problem。一般来说,在使用 Scala 和 Spark 时,您不必过于频繁(或曾经)使用
asInstanceOf或isInstanceOf... -
@TzachZohar 我正在尝试为单词列表创建共现映射以在图形框中创建 Grapg。正在获取帮助的代码是 github.com/Yachironi/twitter-mining/blob/master/src/main/scala/…
标签: scala apache-spark