从RDD中删除空密钥

时间:2016-07-18 14:36:47

标签: scala apache-spark

我正在阅读文本文件并实现字数统计示例。问题是我得到一个带空键的RDD。

这是代码:

val tokens = sc.textFile("test.txt").flatMap(line => line.split(",")).map(_.trim)

val tableForFrequency = tokens.map(word => (word, 1))
  .reduceByKey((a, b) => a + b)

tableForFrequency.saveAsTextFile("file.txt")

我不知道为什么我要空了,我该怎么删除它。

请注意:我是Scala / Spark的新手,在发布此内容之前已经查找了相关问题。

2 个答案:

答案 0 :(得分:3)

让我们考虑以下示例:

val data = Seq("   ","w","w2","")
// data: Seq[String] = List("   ", w, w2, "")

val tokens = sc.parallelize(data).flatMap(line => line.split(",")).map(_.trim)
// tokens: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[9] at map at <console>:29

你需要在triming后过滤掉长度为0的字符串:

val tableForFrequency = tokens.filter(_.length > 0).map(word => (word, 1)).reduceByKey(_ + _)
// tableForFrequency: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[13] at reduceByKey at <console>:31

tableForFrequency.collect
// res4: Array[(String, Int)] = Array((w2,1), (w,1))

答案 1 :(得分:0)

您的filter功能可能会像您需要的那样复杂或简单。

在过滤器函数中,只需编写逻辑,为非空行返回True,为 空的字符串返回False。而且,就字符串而言,empty是另一种表达length == 0

的方式

伪码:

.filter( string.length != 0 )