Как получить указанный вывод без объединитьByKey и aggregateByKey в спарк RDD - PullRequest
0 голосов
/ 05 ноября 2018

Ниже мои данные:

val keysWithValuesList = Array("foo=A", "foo=A", "foo=A", "foo=A", "foo=B", bar=C","bar=D", "bar=D")  

Теперь мне нужны следующие типы вывода, но без с использованием combineByKey и aggregateByKey:

1) Array[(String, Int)] = Array((foo,5), (bar,3))  
2) Array((foo,Set(B, A)),
(bar,Set(C, D)))  

Ниже моя попытка:

scala> val keysWithValuesList = Array("foo=A", "foo=A", "foo=A", "foo=A", "foo=B", "bar=C",
     | "bar=D", "bar=D")  
scala> val sample=keysWithValuesList.map(_.split("=")).map(p=>(p(0),(p(1))))
sample: Array[(String, String)] = Array((foo,A), (foo,A), (foo,A), (foo,A), (foo,B), (bar,C), (bar,D), (bar,D))  

Теперь, когда я набираю имя переменной, за которым следует вкладка, чтобы увидеть применимые методы для сопоставленного СДР, я вижу следующие опции, из которых ни один не может удовлетворить мое требование:

scala> sample.
apply          asInstanceOf   clone          isInstanceOf   length         toString       update         

Так, как я могу добиться этого ??

1 Ответ

0 голосов
/ 05 ноября 2018

Вот стандартный подход.

Обратите внимание: вам нужно работать с СДР. Я думаю, что это узкое место.

Вот, пожалуйста:

val keysWithValuesList = Array("foo=A", "foo=A", "foo=A", "foo=A", "foo=B", "bar=C","bar=D", "bar=D") 

val sample=keysWithValuesList.map(_.split("=")).map(p=>(p(0),(p(1))))

val sample2 = sc.parallelize(sample.map(x => (x._1, 1)))
val sample3 = sample2.reduceByKey(_+_) 
sample3.collect()

val sample4 = sc.parallelize(sample.map(x => (x._1, x._2))).groupByKey()   
sample4.collect()

val sample5 = sample4.map(x => (x._1, x._2.toSet))
sample5.collect()
...