2017-06-13 335 views
0

當我需要從列表中獲取行並將其拆分時,我有下面的場景。如何將RDD [List [String]]轉換爲字符串並將其拆分

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

請把你的代碼中的代碼格式使其更易於閱讀。如果你不知道如何,你可以突出顯示代碼並按Cmd + K或Ctrl + K。 – victor

回答

1

rec的類型是List[String] - 它沒有split(String)方法(正如編譯器正確警告的那樣)。它看起來像你假設你的記錄是用逗號分隔的字符串,但實際上它們不是(當你在其中的每一個上調用println時,它們都印有逗號分隔符,因爲這是List.toString的行爲方式)。

你可以簡單地刪除所有來電split(",")並得到你想要的東西:

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

甚至更​​優雅,使用Scala的字符串插值:

nonErroniousBidsMap.map(rec => s"${rec.head},${rec(1)},US,${rec(5)}") 
+0

非常感謝你的上師,你救了我的一天...非常感謝你...上面我把rec物品映射到了一個叫做Bid的Case類,下面的每一個都包含了出價記錄,例如transUS,transMX和transCA ... ....當我從我的方法返回RDD [Bid] ....但是當返回:: val transAll = transUS.union(transMX).union(transCA)....它給出一個錯誤「type mismatch發現:單位需要RDD [出價]「,所以如何從聯盟上方返回RDD [出價]。 ???請幫幫我。 – user3252097

+0

先生我有類似的問題,因爲這個https://stackoverflow.com/questions/44536380/type-mismatch-found-unit-expected-rddxyz,你能幫我。 – user3252097

相關問題