我对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
}
感谢
答案 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不太熟悉,因此请将上述内容视为伪代码。您还需要添加适当的投影。希望它仍然能给你一个想法。