我有一个包含以下数据的日志文件:
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()
但是我收到了一个错误。谁能告诉我我的陈述有什么问题?
答案 0 :(得分:3)
keyBy
不会更改该值,因此该值保持为单个" unsplit"串。您希望先使用map
执行拆分(获取RDD[Array[String]]
),然后使用keyBy
和mapValues
,就像对拆分结果所做的那样:
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 )。