2016-04-18 5 views
2

у меня есть файл журнала с данными, как следующее:ScalaSpark - Создание пары RDD с ключом и список значений

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

какая ошибка вы получаете? – maasg

ответ

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

BTW - по вашему описанию, звучит, как вы бы также хотите вызвать groupByKey по этому результату (перед вызовом collect), если вы хотите, чтобы каждый zipcode оценивался в одну запись со списком имен. keyBy не выполняет группировку, он просто превращает RDD[V] в RDD[(K, V)], оставляя каждую запись одной записи (с потенциально большим количеством записей с одним и тем же «ключом»).

+0

Здравствуйте, Tzach, Это не работает на самом деле, я использовал val namesByPCode = accountsByPCode.mapValues ​​(поля => (поля (3), fields (4))). Collect(), потому что namesByPCode уже имеет ключ от почтового индекса, но когда Я пытаюсь распечатать его с помощью mkSting(), я получаю ошибку: значение mkString не является членом (String, String), вы можете посоветовать? –

+0

Откуда взялись 'accountsByPCode'? он не существует в вопросе. Если 'accountsdata' является открытым текстом RDD, это делает то, что задает вопрос, - попробуйте, и если это сработает, примите, пожалуйста, ответ для будущих читателей. Не задавайте новый вопрос в комментариях ... –

+0

Плюс см. Мой комментарий в ответе о добавлении вызова 'groupByKey', возможно, это то, что вам не хватает. –

Смежные вопросы