首页 文章

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

提问于
浏览
2

我有一个包含以下数据的日志文件:

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 回答

  • 3

    keyBy 不会更改该值,因此该值保持单个"unsplit"字符串 . 您希望首先使用 map 执行拆分(以获取 RDD[Array[String]] ),然后像在拆分结果上一样使用 keyBymapValues

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

    BTW - 根据你的描述,听起来你也想在这个结果上调用 groupByKey (在调用 collect 之前),如果你想让每个邮政编码评估成一个带有名单的单个记录 . keyBy 不执行分组,它只是将 RDD[V] 变成 RDD[(K, V)] ,使每条记录成为一条记录(可能有许多记录具有相同的"key") .

相关问题