2016-08-22 79 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

相关问题