ScalaSpark - 使用键和值列表创建一对RDD

时间:2016-04-18 10:05:17

标签: 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

我需要创建一对RDD,邮政编码作为密钥,邮政编码中的名称(Last Name,First Name)列表作为值。

我需要使用mapValues并执行以下操作:

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

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

1 个答案:

答案 0 :(得分:3)

keyBy不会更改该值,因此该值保持为单个" unsplit"串。您希望先使用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)],即为每条记录留下一条记录(可能有多条记录具有相同的"密钥&#34 )。