gpt4 book ai didi

java - 使用 Hadoop 解决大数据问题

转载 作者:行者123 更新时间:2023-12-01 13:30:01 25 4
gpt4 key购买 nike

我的项目包括比较两个大文件(csv 文件> 4Go),它们具有相同的数据但结构不同(列 ID 可以是文件 1 中的第一个,文件 2 中的第 9 个......)。我想我可以使用 MapReduce 程序来解决这个问题。但实际上,我对 Pig 和 Hive 的一些了解感到困惑......

Hive 是否可以让这个问题变得更容易,我是否需要使用映射/归约程序?

最佳答案

如果您愿意考虑非 Hadoop 解决方案,那么这个问题对于 HPCC 平台的代码来说相对较小 ( http://hpccsystems.com/ )。

首先,您会将文件喷射到 HPCC 平台上,然后定义两个文件及其单独的结构,并比较它们,很可能使用 JOIN 函数。下面是一些功能齐全的代码来演示它是如何完成的:

rec1 := RECORD  //record layout of first file
UNSIGNED ID;
STRING20 txt1;
STRING20 txt2;
STRING20 txt3;
END;

rec2 := RECORD //record layout of second file
STRING20 Str2;
STRING20 Str1;
STRING20 Str3;
UNSIGNED ColumnID;
END;

// This is the way the files would be defined using your CSV files:
// ds1 := DATASET('FirstCSVfile',rec1,CSV);
// ds2 := DATASET('SecondCSVfile',rec2,CSV);

// These inline files just demo the code:
ds1 := DATASET([{1,'Field1','Field2','Field3'},
{2,'Field1','Field2','Field3'},
{3,'Field1','Field2','Field3'},
{4,'Field1','Field2','Field3'},
{5,'Field1','Field2','Field3'}],rec1);

ds2 := DATASET([{'Field2','Field1','Field3',1},
{'F2','Field1','Field3',2},
{'Field2','F1','Field3',3},
{'Field2','Field1','Field3',5}],rec2);

Rec1 CmpFields(Rec1 L, Rec2 R) := TRANSFORM
SELF.ID := L.ID;
SELF.txt1 := IF(L.txt1=R.Str1,L.txt1,'');
SELF.txt2 := IF(L.txt2=R.Str2,L.txt2,'');
SELF.txt3 := IF(L.txt3=R.Str3,L.txt3,'');
END;

Cmp := JOIN(ds1,ds2,LEFT.ID = RIGHT.ColumnID,CmpFields(LEFT,RIGHT),LEFT OUTER);

Cmp; //just show the result
Cmp(txt1='' AND txt2='' AND txt3=''); // filter for only non-matches on ID
Cmp(txt1='' OR txt2='' OR txt3=''); // filter for all non-matching field data

这是两个文件的简单 LEFT OUTER JOIN,基于匹配的 ID 字段值(即使它们的命名和位置不同)。 TRANSFORM 函数进行逐个字段的比较(请注意,这些文本字段在两个文件中的命名也不同),当字段值不匹配时仅生成空白。

关于java - 使用 Hadoop 解决大数据问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21622792/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com