在apache-spark scala中访问Array RDD的特定元素

时间:2017-01-28 09:07:35

标签: scala apache-spark bigdata

我有一个RDD,它包含一组键值对。我想获得一个带键的元素(比如4)。

scala> val a = sc.parallelize(List("dog","tiger","lion","cat","spider","eagle"),2)
a: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[0] at parallelize at <console>:27
scala> val b = a.keyBy(_.length)
b: org.apache.spark.rdd.RDD[(Int, String)] = MapPartitionsRDD[1] at keyBy at <console>:29

我尝试对其应用过滤器,但收到错误。

scala> val c = b.filter(p => p(0) = 4);
<console>:31: error: value update is not a member of (Int, String)
         val c = b.filter(p => p(0) = 4);

我想将特定键(比如4)的键值对打印为Array((4,lion))

数据总是以键,值对

的数组形式出现

2 个答案:

答案 0 :(得分:1)

使用p._1代替p(0)

val rdd = sc.parallelize(List("dog", "tiger", "lion", "cat", "spider", "eagle"), 1)

val kvRdd: RDD[(Int, String)] = rdd.keyBy(_.length)
val filterRdd: RDD[(Int, String)] = kvRdd.filter(p => p._1 == 4)

//display rdd
println(filterRdd.collect().toList)

List((4,lion))

答案 1 :(得分:1)

lookup方法适用于直接提供此功能的键值对(类型为b.lookup(4) // res4: Seq[String] = WrappedArray(lion) b.lookup(5) // res6: Seq[String] = WrappedArray(tiger, eagle) 的RDD)的RDD。

 ...
 if ($this->User->save($this->data)) {

   App::uses('CakeEmail', 'Network/Email');
   $settings = $this->requestAction('pages/setting');

         $this->email = new CakeEmail('smtp');

         $email = $select['User']['email'];
         $content = sprintf('<body> Sevgili ' . $select['User']['username'] . ", <br>
            Şifre yenileme talebiniz tarafımıza iletilmiştir.
            Aşağıdaki linki tıklayarak yeni şifrenizi belirleyebilirsiniz. <br>
            <a href=\"http://%s/%s\">Buraya Tıklayınız</a> <br>
            Keyifli Gezintiler <br>
            Yukardaki link ile bağlantı sağlayamıyorsanız,
            linki web tarayıcınızın adres bölümüne kopyalayabilirsiniz.</body>", $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'], $code);

         $this->email->from(array($settings['Setting']['smtp_mail'] => $settings['Setting']['title']))
             ->to($email)
             ->emailFormat('html')
             ->subject('Şifre Yenileme [' . time() . ']');

         if ($this->email->send($content)) {
         $this->Session->setFlash(__('Şifre güncelleme bilgileriniz E-Posta adresinize gönderilmiştir.'), 'default', array('class' => 'success'));
         } else {
         trigger_error("error Mail");
         }

         $this->redirect('forgot');
}