2016-08-24 3 views
2

나는 몇 개의 jar 파일을 사용하고있는 HL7 값을 구문 분석하려고하는데, 그 jar 파일은 문자열에서 HL7 값을 파싱하고 코드를 실행했으며 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를 추출하고 추출해야합니다. 당신이 (I've mentioned in my previous answer으로 RDD.collect을 사용할 수 있습니다,이를 테스트하는 경우

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") 
     } 
    } 
    } 
} 

및 구문 분석 된 파일을 보려는 : 우리는 그래서 우리는 각 값에 대해 HapiContext 새로운를 할당 할 필요가 없습니다 mapPartitions를 사용하여 작업을 수행 할 수 있습니다 하지만 물론 은 어떤 종류의 프로덕션 환경에서도 이것을 사용할 때이 아닙니다.

+0

도움을 주셔서 감사합니다. 제 문제를 해결했습니다. 나는 당신에게 이것에 대해 어떻게 감사해야할지 모르겠다. – animal

+0

내 파일에 여러 개의 'PID'가있는 경우이 코드가 작동하는지 한 가지 더 알고 싶습니까? – animal

+1

@animal 잘 작동합니다. 여러 개의 pid를 반환하더라도 Seq [Seq [String]]을 처리 할 것이므로 조작중인 컬렉션이 무엇인지 확인하십시오. –