Этот пост по существу о том, как построить совместные и маргинальные гистограммы из RDD (String, String). Я опубликовал код, который в итоге использовал ниже в качестве ответа.

У меня есть RDD, который содержит набор кортежей типа (String,String), и, поскольку они не уникальны, я хочу посмотреть, сколько раз встречается каждая комбинация String, String, поэтому я использую {{X2 }} вот так

val PairCount = Pairs.countByValue().toSeq

Который дает мне кортеж в виде вывода, подобного этому ((String, String), Long), где long - это количество раз, когда кортеж (String, String) появлялся

Эти строки могут повторяться в разных комбинациях, и я, по сути, хочу запустить подсчет слов в этой переменной PairCount, поэтому я попробовал что-то вроде этого для начала:

PairCount.map(x => (x._1._1, x._2))

Но вывод, который это выплевывает, будет String1-> 1, String2-> 1, String3-> 1 и т. Д.

Как мне вывести пару значений ключа из задания карты в этом случае, когда ключ будет одним из значений String из внутреннего кортежа, а значение будет значением Long из внешнего кортежа?

Обновление: @vitalii почти добрался до меня. ответ приводит меня к Seq [(String, Long)], но что мне действительно нужно, так это превратить это в карту, чтобы потом я мог запустить reduceByKey. когда я бегу

PairCount.flatMap{case((x,y),n) => Seq[x->n]}.toMap

Для каждого уникального x я получаю x- & gt; 1

Например, приведенная выше строка кода генерирует mom-> 1 dad-> 1, даже если кортежи из flatMap включены (mom, 30) (dad, 59) (mom, 2) (dad, 14), и в этом случае я бы ожидайте, что toMap предоставит мама-> 30, папа-> 59 мама-> 2 папа-> 14. Однако я новичок в scala, поэтому могу неправильно интерпретировать функциональность.

Как я могу преобразовать последовательность Tuple2 в карту, чтобы уменьшить количество ключей карты?

0
Semicolons and Duct Tape 25 Фев 2016 в 05:39

2 ответа

Лучший ответ

Чтобы получить гистограммы для RDD (String, String), я использовал этот код.

val Hist_X  = histogram.map(x => (x._1-> 1.0)).reduceByKey(_+_).collect().toMap
val Hist_Y  = histogram.map(x => (x._2-> 1.0)).reduceByKey(_+_).collect().toMap
val Hist_XY = histogram.map(x => (x-> 1.0)).reduceByKey(_+_)

Где гистограмма была (String, String) RDD

0
Semicolons and Duct Tape 4 Май 2016 в 00:17

Если я правильно понял вопрос, вам понадобится flatMap:

val pairCountRDD = pairs.countByValue() // RDD[((String, String), Int)]
val res : RDD[(String, Int)] = pairCountRDD.flatMap { case ((s1, s2), n) =>
   Seq(s1 -> n, s2 -> n)
}

Обновление: я не понял, какова ваша конечная цель, но вот еще несколько примеров, которые могут вам помочь, кстати, приведенный выше код неверен, я пропустил тот факт, что countByValue возвращает карту, а не СДР:

val pairs = sc.parallelize(
  List(
    "mom"-> "dad", "dad" -> "granny", "foo" -> "bar", "foo" -> "baz", "foo" -> "foo"
  )
)
// don't use countByValue, if pairs is large you will run out of memmory
val pairCountRDD = pairs.map(x => (x, 1)).reduceByKey(_ + _) 

val wordCount = pairs.flatMap { case (a,b) => Seq(a -> 1, b ->1)}.reduceByKey(_ + _)

wordCount.take(10)

// count in how many pairs each word occur, keys and values:
val wordPairCount = pairs.flatMap { case (a,b) => 
               if (a == b) {
                 Seq(a->1)
               } else {
                  Seq(a -> 1, b ->1)
               }
             }.reduceByKey(_ + _)
wordPairCount.take(10)
1
vitalii 26 Фев 2016 в 13:35