2016-08-22 124 views
1

我最初的RDD如下所示RDD[(String, List[(String,String)])]獲取列表[Serializable接口]而不是列表[(字符串,字符串)

(600,List((22,33),(55,88))) 
(700,List((12,13),(15,18),(18,88))) 

我想從Redis的緩存數據庫獲得額外的數據每個條目追加。爲此,我使用Sedis,它是Scala的Jedis的包裝。這是我的代碼片段:

import org.sedis._ 
import redis.clients.jedis._ 

val redisPool = new Pool(new JedisPool(new JedisPoolConfig(), "localhost", 6379, 2000)) 

val appended = filtered.map({line => (line._1, 
    redisPool.withJedisClient { client => 
    val additionalData: List[String] = Dress.up(client).hvals("member_id:"+line._1) 
    line._2.union(additionalData) 
    }) 
}) 

的問題是,appended是格式RDD[(String, List[Serializable]而不是RDD[(String, List[(String,String)])]的。我究竟做錯了什麼? 另外,我在哪裏使用redisPool內部map足夠高效或有沒有其他更好的選擇?

+0

什麼是'line._2's類型? –

+0

你說你的初始RDD的類型是'RDD [(String,List [(String,String)])]',但是你提供的示例數據不匹配 - '(600,List(22,33), List(55,88))'是類型'(String,List [(String,String)],List [(String,String)])'...並且第二條記錄再次不同。由編譯器爲您提供的_input_推斷的類型是'RDD [(帶有可序列化的產品)]' –

+0

@TzachZohar:對不起,我的錯。它確實是'List((22,33),(55,88))' – HackerDuck

回答

2
  1. line._2.union(additionalData)創建的line._2它具有類型List[(String, String)]additionalData其具有類型List[Sting]聯合。結果必須是這兩種不同類型中最準確的常見類型 - 即List[Serializable]。 如果additionalData的類型爲List[(String, String)],那就是結果類型。

  2. 至於JedisPool使用效率:通常,從星火轉型打開連接到一些外部資源時,你應該使用mapPartitions,其執行在每個RDD的分區的給定函數。爲什麼?在您當前的實現下,該池在驅動程序應用程序中創建,然後序列化併發送給每個執行程序,以進行反序列化並用於映射。這通常是失敗,因爲這樣的池擁有執行程序中不存在的某種連接(可能是開放式套接字),只存在於創建它的驅動程序中。一種(低效率)替代方法是在map函數內創建池(每個記錄)。更好的選擇是使用mapPartitions:

    val appended = filtered.mapPartitions(iter => { 
        val redisPool = new Pool(new JedisPool(new JedisPoolConfig(), "jedis-host", 6379, 2000)) 
    
        iter.map({line => (line._1, 
        redisPool.withJedisClient { client => 
        val additionalData: List[String] = Dress.up(client).hvals("member_id:"+line._1) 
        line._2.union(additionalData) 
        }) 
        }) 
        // close the pool, if relevant 
    }) 
    
+0

所以,我理解正確的是'List [Serializable ]'實際上看起來像例如List((12,33),(12,55),(aa,bb,cc))',其中'(aa,bb,cc)'是附加數據? – HackerDuck

+0

幾乎:'List((12,33),(12,55),aa,bb,cc)' –

+0

如何才能訪問此列表中的每個元素?我的意思是我怎麼能得到'aa'?據我所見'entry(2)'不起作用。 – HackerDuck

相關問題