2016-01-21 2 views
0

У меня есть RDD, который содержит ключи строки HBase. RDD относительно велик, чтобы вписаться в память. Мне нужно получить RDD значений для каждого из предоставленных ключей. Есть ли способ сделать что-то вроде этого:Spark: сопоставление RDD ключей строки HBase с RDD значений

keys.map(key => table.get(new Get(key))) 

Таким образом, вопрос, как я могу получить экземпляр HTable внутри задачи карты? Должен ли я создать экземпляр HConnection для каждого раздела, а затем получить экземпляр HTable от него или есть лучший способ?

ответ

0

Есть несколько вариантов, которые вы можете сделать, но сначала подумайте, что искра не позволяет создавать RDD из RDD. Так на самом деле, что оставляет вас с двумя вариантами

  1. список РДУ
  2. Ключ/значение РДД

Я очень рекомендую второй в виде списка РДУ может закончиться с вами необходимости выполнить множество сокращений, которые могли бы значительно увеличить количество перетасовки, которые вам нужно выполнить. Имея это в виду, я бы рекомендовал вам использовать flatMap.

Так вот некоторые основные скелет кода, который вы могли бы получить этот результат

val input:RDD[String] 
val completedRequests:RDD[(String, List[String]) = input.map(a => (a, table.get(new Get(a))) 
val flattenedRequests:RDD[(String, String) = completedRequests.flatMap{ case(k,v) => v.map(b =>(k,b)) 

Теперь Вы можете обрабатывать RDD как один объект, reduceByKey если у вас есть определенная часть информации, которую нужно от него, и теперь искра сможет получить доступ к данным с оптимальным параллелизмом.

Надеюсь, что это поможет!

+0

Спасибо, но я имел в виду нечто другое: речь идет о получении экземпляра HTable внутри задачи карты. Я отредактировал свой вопрос для разъяснения. –

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