您好我正在使用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
答案 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
}
}