2017-06-13 51 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

相关问题