복붙노트

[HADOOP] RDD [목록 [문자열] 문자열에 도착하고 분할하는 방법

HADOOP

RDD [목록 [문자열] 문자열에 도착하고 분할하는 방법

나는 목록에서 선을 얻고 그것을 분할해야 할 때 나는 시나리오 아래에 있습니다.

scala> var nonErroniousBidsMap = rawBids.filter(line => !(line(2).contains("ERROR_") || line(5) == null || line(5) == ""))
nonErroniousBidsMap: org.apache.spark.rdd.RDD[List[String]] = MapPartitionsRDD[108] at filter at <console>:33

scala> nonErroniousBidsMap.take(2).foreach(println)
List(0000002, 15-04-08-2016, 0.89, 0.92, 1.32, 2.07, , 1.35)
List(0000002, 11-05-08-2016, 0.92, 1.68, 0.81, 0.68, 1.59, , 1.63, 1.77, 2.06, 0.66, 1.53, , 0.32, 0.88, 0.83, 1.01)

scala> val transposeMap = nonErroniousBidsMap.map( rec => ( rec.split(",")(0) + "," + rec.split(",")(1) + ",US" + "," + rec.split(",")(5) ) )
<console>:35: error: value split is not a member of List[String]
     val transposeMap = nonErroniousBidsMap.map( rec => ( rec.split(",")(0) + "," + rec.split(",")(1) + ",US" + "," + rec.split(",")(5) ) )
                                                              ^

위와 같이 나는 오류를 얻고있다. 어떻게이 문제를 해결하는 데 도움 주실 래요?

감사합니다.

해결법

  1. ==============================

    1.녹화의 유형 목록 [문자열]입니다 - (컴파일러가 제대로 경고로) 분할 (String) 메소드를 가지고 있지 않는. 당신이 당신의 기록을 쉼표로 구분 된 문자열 가정하고 있지만 (즉 List.toString의 동작 방법은 간단하기 때문에 당신이 그들의 각 하나에 println 호출 할 때, 그들은 쉼표 구분 기호를 사용하여 인쇄) 사실은 그렇지 않은 것 같습니다.

    녹화의 유형 목록 [문자열]입니다 - (컴파일러가 제대로 경고로) 분할 (String) 메소드를 가지고 있지 않는. 당신이 당신의 기록을 쉼표로 구분 된 문자열 가정하고 있지만 (즉 List.toString의 동작 방법은 간단하기 때문에 당신이 그들의 각 하나에 println 호출 할 때, 그들은 쉼표 구분 기호를 사용하여 인쇄) 사실은 그렇지 않은 것 같습니다.

    당신은 단순히 ( ",") 분할하는 모든 호출을 제거하고 당신이 원하는 것을 얻을 수 있습니다 :

    nonErroniousBidsMap.map(rec => rec.head + "," + rec(1) + ",US" + "," + rec(5))
    

    심지어 더 우아하게, 스칼라의 문자열 보간을 사용하여 :

    nonErroniousBidsMap.map(rec => s"${rec.head},${rec(1)},US,${rec(5)}")
    
  2. from https://stackoverflow.com/questions/44529162/how-to-get-rddliststring-to-string-and-split-it by cc-by-sa and MIT license