【问题标题】:Join 2 tables in hadoop在 hadoop 中加入 2 个表
【发布时间】:2016-03-17 12:26:11
【问题描述】:

我对 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 完成此连接。

【问题讨论】:

  • 我个人会使用 Pig,但您是否看过 Pig 或 Hive Join 语法?文档中的示例很简单
  • 两张表在哪里?在蜂巢?在文件中?
  • 它作为文件存储在hdfs中。
  • Pig 和 Hive 的构建目标几乎完全相同 :)
  • 李牧北说得对。将数据加载到 2 个配置单元表中,并像普通数据库表一样连接它们。

标签: hadoop hive apache-pig hadoop2


【解决方案1】:

使用 pig 脚本的简单方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 2023-02-13
    • 2022-01-08
    • 2018-02-05
    • 2019-02-18
    相关资源
    最近更新 更多