如何在RDD spark中添加唯一值

时间:2016-12-06 06:55:52

标签: scala apache-spark

您好我正在使用scala来识别行的第一个单词并创建一个唯一值并将其附加到RDD中。但我不知道该怎么做。我是斯卡拉的新手所以如果这个问题听起来很蹩脚,请原谅。 我正在尝试的样本如下所示。

示例:

System.out.println(System.getProperty("java.library.path"));

我想检查第一个单词 OBR 是否为OBR而不是我创建一个唯一值并想要将其附加到OBR中 OBX 下面直到我发现了另外一个我想做的OBR。但我怎么能这样做?我从 HDFS 中提取数据。

预期结果:

OBR|1|METABOLIC PANEL
OBX|1|Glucose
OBX|2|BUN
OBX|3|CREATININE
OBR|2|RFLX TO VERIFICATION
OBX|1|EGFR
OBX|2|SODIUM
OBR|3|AMBIGUOUS DEFAULT
OBX|1|POTASSIUM

1 个答案:

答案 0 :(得分:1)

好的,正如我在评论中所提到的,这只会在单个核心上运行,不应该使用spark来完成,除非有人可以对我失踪的东西有所了解。 我假设该文件只是hdfs上的一个文本文件,如您的示例中所述。

val text: RDD[(String, Long)] = sc.textFile(<path>).zipWithIndex
val tupled: RDD[((String, Int, String), Int)] = text.map{case (r, i) => (r.split('|'), i)).map{case (s, i) => ((s(0), s(1).toInt, s(2)), i)}
val obrToFirstIndex: Array[(Int, Long)] = tupled.filter(_._1._1 == "OBR").map{case (t, i) => (t._2, i)}.reduceByKey(Math.min).collect()
val bcIndexes = sc.broadcast(obrToFirstIndex.sortBy(_._2))
val withObr = tupled.mapValues(i => bcIndexes.value.find(_._2 >= i).getOrElse(bcIndexes.value.last)._1)
val result: RDD[String] = withObr.map{case ((t1, t2, t2), obrind) => Array(t1, t2, t3, s"OBR_filaneme_$obrind").mkString("|")

在我目前的环境中,我无法对上述内容进行测试,因此可能会受到一个错误或轻微的错别字的影响,但这个想法就在那里。但请允许我重申,这不是一个火花的工作。

编辑:刚发生在我身上,因为只有一部分你可以使用mapPartitions,只需编写代码就可以在该分区中的Java / Scala中编写代码。

您遇到的问题是查找不正确,需要使用不同的条件。这是我之前使用mapPartitions

提到的更简单的方法
val text: RDD[String] = sc.textFile(<path>)
val result: RDD[String] = text.mapPartitions{part =>
    var obrInd = 0
    part.map{r =>
        val code= r.split('|')(0)
        if(code == "OBR") obrInd += 1
        r + "|OBR_filename_" + obrInd
    }
}