mkString 和 sortByKey 不适用于 Spark 中的数组

Posted

技术标签:

【中文标题】mkString 和 sortByKey 不适用于 Spark 中的数组【英文标题】:mkString and sortByKey are not working with Arrays in Spark 【发布时间】:2016-04-18 20:54:07 【问题描述】:

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

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)) 
                          ^

有人能告诉我我的代码有什么问题吗?

【问题讨论】:

【参考方案1】:

你得到一个错误

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)

【讨论】:

【参考方案2】:

这是因为您创建的是 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(","))

做其中之一(不要同时做!)。

【讨论】:

现在 mkString 正在工作,但 sortByKey 给了我这个错误: :39: error: value sortByKey is not a member of Array[(String, Array[String])]

以上是关于mkString 和 sortByKey 不适用于 Spark 中的数组的主要内容,如果未能解决你的问题,请参考以下文章

apache spark中的sortbykey

scala mkstring

spark wordcont Spark: sortBy和sortByKey函数详解

PySpark 中的 mkString 等价物是啥?

为啥 sortByKey 的火花这么慢?他们有啥替代方案吗?

Spark 使用sortByKey进行二次排序