[Scala / Scalding]:将ID映射到名称

时间:2014-04-16 00:23:41

标签: map filter scalding

我对Scalding相当新,我正在尝试编写一个作为输入2数据集的烫金程序: 1)book_id_title :(' id,' title):包含书籍ID和书名之间的映射,两者都是字符串。 2)book_sim :(' id1,' id2,' sim):包含由其ID标识的书籍对之间的相似性。

烫洗程序的目标是通过查找book_id_title表将book_ratings中的每个(id1,id2)替换为各自的标题。但是,我无法检索标题。如果有人可以帮助下面的getTitle()函数,我将不胜感激。

我的烫金代码如下:

  // read in the mapping between book id and title from a csv file
  val book_id_title =
       Csv(book_file, fields=book_format)
         .read
         .project('id,'title)

   // read in the similarity data from a csv file and map the ids to the titles
   // by calling getTitle function
  val result = 
      book_sim
      .map(('id1, 'id2)->('title1, 'title2)) {
           pair:(String,String)=> (getTitle(pair._1), getTitle(pair._2))
       }
      .write(out)


  // function that searches for the id and retrieves the title
  def getTitle(search_id: String) = {
      val btitle = 
         book_id_title
           .filter('id){id:String => id == search_id} // extract row matching the id
           .project('title)  // get the title
   }

感谢

1 个答案:

答案 0 :(得分:1)

Hadoop是一个批处理系统,无法按索引查找数据。相反,你需要通过id加入book_id_title和book_sim,可能需要两次:对于左和右id。类似的东西:

book_sim.joinWithSmaller('id1->id, book_id_title).joinWithSmaller('id2->id, book_id_title)

我对基于字段的API不太熟悉,因此请将上述内容视为伪代码。您还需要添加适当的投影。希望它仍然能给你一个想法。