我的项目包括比较具有相同数据但结构不同的两个大文件(csv文件> 4Go)(列id可以是文件1中的第一个文件,文件2中的第9个文件...)。 我以为我可以使用MapReduce程序解决这个问题。但实际上我对阅读Pig和Hive有点困惑......
Hive是否更容易解决这个问题,我是否需要使用map / reduce程序?
答案 0 :(得分:1)
如果您愿意查看非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
这是基于匹配的ID字段值的两个文件的简单LEFT OUTER JOIN(即使它们的命名和定位不同)。 TRANSFORM函数进行逐字段比较(注意,这两个文本字段在两个文件中的名称也不同),只是在字段值不匹配时产生空白。
答案 1 :(得分:0)
Hive基本上是用于在数据上放置表结构,并允许您执行SQL命令。如果您很好地了解数据结构并可以创建相应的表,则可以将数据上传到HDFS和create an external table over the top
创建查询时,Hive会将其解释为MapReduce作业并针对数据运行它。无需编写自己的地图缩减工作。
我个人并不喜欢Talend,但它可能值得一看,因为它是免费的并且确实做得很好。我不喜欢它,因为你下载Talend试图销售咨询服务时会有一连串的联系。
给Talend一个机会,看看Talend by example