在hadoop

时间:2016-03-17 12:26:11

标签: hadoop hive apache-pig hadoop2

我对hadoop很新,所以请耐心等待。任何帮助,将不胜感激。

我需要加入2张桌子, 表1将具有pagename,pagerank 例如。实际数据集很大但具有相似的模式

pageA,0.13
pageB,0.14
pageC,0.53

表2,它是一个简单的wordcount类表,带有word,pagename 例如。实际数据集很大但具有相似的模式

test,pageA:pageB
sample,pageC
json,pageC:pageA:pageD

现在,如果用户搜索第二个表中的任何单词,我应该根据表1中的pagerank向他提供页面结果。

搜索测试时的输出,

test = pageB,pageA

我的方法是将第一个表加载到分布式缓存中。在map方法中读取第二个表获取该单词的页面列表,使用第一个表中的pagerank信息对列表进行排序,该表加载到分布式缓存中。这适用于我正在工作的数据集,但想知道是否有更好的方法,也想知道如何使用pig或hive进行连接。

1 个答案:

答案 0 :(得分:1)

使用猪脚本的简单方法:

PAGERANK = LOAD 'hdfs/pagerank/dataset/location' USING PigStorage(',')
    AS (page:chararray, rank:float);

WORDS_TO_PAGES = LOAD 'hdfs/words/dataset/location' USING PigStorage(',')
    AS (word:chararray, pages:chararray);

PAGES_MATCHING = FOREACH (FILTER WORDS_TO_PAGES BY word == '$query_word') GENERATE FLATTEN(TOKENIZE(pages, ':'));

RESULTS = FOREACH (JOIN PAGERANK BY page, PAGES_MATCHING BY $0) GENERATE page, rank;

SORTED_RESULTS = ORDER RESULTS BY rank DESC;
DUMP SORTED_RESULTS;

脚本需要一个参数,即查询词:

 pig -f pagerank_join.pig -param query_word=test