2016-08-24 61 views
2

我想解析HL7值,我使用的是几个jar文件,那些jar文件从字符串中解析HL7值,我执行了代码,它在scala中工作正常,但现在我希望同样的东西在scala中运行,因为我在下面的代码中使用了示例,但是我得到了下面的错误。所以要解决我想要将org.apache.spark.rdd.RDD[String]转换为String的问题。变换RDD中的字符串集合

代码:

object ExampleUseTerser { 
    def main(args: Array[String]): Unit = { 
    val textfile = sc.textFile("/user/cloudera/xxxx/File") 
    val context : HapiContext = new DefaultHapiContext(); 
    val p = context.getGenericParser(); 
    val hapiMsg = p.parse(textfile); 
    val terser = new Terser(hapiMsg); 
    val secondAllergyType:String = terser.get("/PID-7"); 
    println(secondAllergyType); 

    } 
} 

更新

样品:

PID|1|5897450M|58974650M|58977650M|CSTO^TES||19320722|F|||745 - 81 ST^^IAMI BEH^FL^341|||||||332165520 
ORC||5033220|503320||||||20150202|||1689659096^HAM^MISH^^^^PI 
OBR|1||64564|DF DEFAULT|||20150202|2015002||||||||16096^^^^^I||||||||| 
HHH|1|NM|6690-2^^LN^0^^L||7|XE/UL|3.4-18||||F|||20150202| ^^L 
HHH|9|NM|777-3^LOINC^LN^015172^PLATELETS^L||185|X10E3/UL|150-379||||F|||201202|TA ^^L 
HHH|10|NM|770-8^^LN^015107^^L||65|%|||||F|||20150202|TA ^^L 
HHH|11|NM|736-9^LOINC^LN^015123^^L||26|%|||||F|||20150202|TA ^^L 
HHH|12|NM|5905-5^LOINC^LN^015131^^L||8|%|||||F|||20150202|TA ^^L 
HHH|13|NM|713-8^LOINC^LN^015149^^L||1|%|||||F|||20150202|TA ^^L 

错误:

error: type mismatch; 
found : org.apache.spark.rdd.RDD[String] 
required: String 
      val hapiMsg = p.parse(textfile); 
+0

你得到了什么,你期望什么?你能提供一些样本数据吗? – sebszyller

+0

'RDD'是* Resilient Distributed ** DataSet ***,它不是一个值的抽象,而是一组值。在值的集合上使用'toString'几乎总是不是你想要做的。 –

+1

@YuvalItzchakov让他崩溃一个或两个节点:) – sebszyller

回答

3

当你使用RDD时,你需要记住的是,抽象超过值的集合(它实际上更复杂一点,但让我们暂时保留它),而不是一个单一的值。

以您的示例为例,我们需要映射集合中的所有元素并尝试并提取它们的PID。我们可以通过mapPartitions所以我们没有分配新的HapiContext每个值做到这一点:

object ExampleUseTerser { 
    def main(args: Array[String]): Unit = { 
    val textfile = sc.textFile("/user/cloudera/xxxx/File") 
    val parsedData = textfile.mapPartitions { it => 
     val context: HapiContext = new DefaultHapiContext() 
     val parser = context.getGenericParser() 

     it.map { file => 
     val hapiMsg = parser.parse(file) 
     val terser = new Terser(hapiMsg) 
     terser.get("/PID-7") 
     } 
    } 
    } 
} 

如果您正在测试这一点,并要查看解析的文件,你可以使用RDD.collectI've mentioned in my previous answer(但是当在任何类型的生产环境中使用时,不会那样做)。

+0

非常感谢您的帮助,它解决了我的问题。我不知道该怎么谢谢你。 – animal

+0

我想知道更多的事情是这个代码去工作,如果我在我的文件中有多个'PID'? – animal

+1

@animal它应该工作正常。尽管如果你返回多个pid,你将会处理一个'Seq [Seq [String]]',所以确保你知道你正在使用哪个集合。 –