【问题标题】:ScalaSpark - Create a pair RDD with a key and a list of valuesScalaSpark - 使用键和值列表创建对 RDD
【发布时间】:2016-08-10 00:14:29
【问题描述】:

我有一个日志文件,其数据如下:

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

我需要创建一个以邮政编码为键的 RDD 对,并在该邮政编码中创建一个名称列表 (Last Name,First Name) 作为值。

我需要使用mapValues,我做了以下操作:

val namesByPCode = accountsdata.keyBy(line => line.split(',')(8)).mapValues(fields => (fields(0), (fields(4), fields(5)))).collect()

但我遇到了一个错误。谁能告诉我我的陈述有什么问题?

【问题讨论】:

  • 你遇到了什么错误?

标签: scala apache-spark bigdata


【解决方案1】:

keyBy 不会更改该值,因此该值保持为单个“未拆分”字符串。您想首先使用map 执行拆分(以获得RDD[Array[String]]),然后像拆分结果一样使用keyBymapValues

val namesByPCode = accountsdata.map(_.split(","))
  .keyBy(_(8))
  .mapValues(fields => (fields(0), (fields(4), fields(5))))
  .collect()

顺便说一句 - 根据您的描述,如果您希望每个邮政编码评估为带有名称列表的单个记录,听起来您还想在此结果上调用 groupByKey(在调用 collect 之前)。 keyBy 不执行分组,它只是将 RDD[V] 转换为 RDD[(K, V)] 留下一条记录(可能有许多具有相同“键”的记录)。

【讨论】:

  • Hello Tzach,这实际上不起作用,我使用了 val namesByPCode = accountsByPCode.mapValues(fields => (fields(3), fields(4))).collect() 因为 namesByPCode 已经用邮政编码键入,但是当我尝试使用 mkSting() 打印时,出现错误:值 mkString 不是 (String, String) 的成员,您能建议吗?
  • accountsByPCode 是从哪里来的?它在问题中不存在。如果accountsdata 是纯文本RDD,这就是问题所要求的——试一试,如果它有效,请接受答案以供未来读者查看。不要在 cmets 中提出新问题...
  • 另外,请参阅我在答案中关于添加 groupByKey 呼叫的评论,也许这就是您所缺少的。
  • 是的,你是对的,它确实有效。现在我正在尝试打印前 5 个邮政编码并列出如下名称: println(s"======= namesByPCode, style2 =======") for (pair 但我得到了这个错误::37: error : 值 sortByKey 不是 Array[(String, (String,(String, String)))] 的成员
猜你喜欢
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 1970-01-01
  • 2013-08-27
  • 2019-11-29
相关资源
最近更新 更多