mkString和sortByKey不能与Spark中的Arrays一起使用

时间:2016-04-18 20:54:08

标签: scala apache-spark bigdata

我有一个日志文件(帐户),其数据如下:

1,2008-10-23 16:05:05.0,\N,Donald,Becton,2275 Washburn Street,Oakland,CA,94660,5100032418,2014-03-18 13:29:47.0,2014-03-18 13:29:47.0
2,2008-11-12 03:00:01.0,\N,Donna,Jones,3885 Elliott Street,San Francisco,CA,94171,4150835799,2014-03-18 13:29:47.0,2014-03-18 13:29:47.0

1-我使用以下方式获取了日志文件:

val accountsdata = sc.textFile("C:/Users/Sam/Downloads/account1.txt")

2-我想通过邮政/邮政编码来关键帐户,所以我做了以下事情: val accountsByPCode = accountsdata.keyBy(line => line.split(',') (8)).mapValues(line => line.split(",")) --->这很好用。

3-然后我想将accountsByPCode映射到lastname,firstname作为值,我使用以下方法完成: val namesByPCode = accountsByPCode.mapValues(fields => (fields(3), fields(4))).collect() - >这也很好,但是当我尝试使用以下方法打印它时:

println(s"======= namesByPCode, style1 =======")
 for (pair <- namesByPCode.take(5)) {
  printf("%s, [%s] \n",pair._1,pair._2.mkString(","))
 }

我收到了这个错误:

error: value mkString is not a member of (String, String)
  printf("%s, [%s] \n",pair._1,pair._2.mkString(","))
                                   ^

当我尝试使用:

sortByKey时
println(s"======= namesByPCode, style2 =======")
 for (pair <- namesByPCode.sortByKey().take(5)) {
  println("---" + pair._1)
  pair._2.take(3)foreach(println) 
}

我收到以下错误:

error: value sortByKey is not a member of Array[(String, (String,String))]
  for (pair <- namesByPCode.sortByKey().take(5)) {
                          ^

有人可以告知我的代码有什么问题吗?

2 个答案:

答案 0 :(得分:0)

这是因为您创建了Tuple2[String,String]而不是Array[String]。尝试:

val namesByPCode = accountsByPCode.mapValues(fields => Array(fields(3), fields(4))).collect()

或者将您选择的代码更改为:

printf("%s, [%s] \n",pair._1,Array(pair._2._1, pair._2._2).mkString(","))

做其中一个(不要两个都做!)。

答案 1 :(得分:0)

中出现错误
error: value sortByKey is not a member of Array[(String, (String,String))]
  for (pair <- namesByPCode.sortByKey().take(5)) {

只是因为你确实收集了上一步

val namesByPCode = accountsByPCode.mapValues(fields => (fields(3),  fields(4))).collect()

由于您致电collect(),因此您不再拥有RDD。您正在使用数组。您只需要在收集之前按键对数据进行排序。

val namesByPCode = accountsByPCode.mapValues(fields => (fields(3),  fields(4))).sortByKey().collect()

现在你有了一个排序数组。如果您不需要整个数组,则应将collect()替换为take(5)