Hadoop PIG将文本行转换为稀疏向量

Hadoop PIG将文本行转换为稀疏向量,hadoop,apache-pig,Hadoop,Apache Pig,我必须使用ApachePig将需要合并的文件添加到一起。第一个文件包含书名列表,就像这样,每个书名都在一行中 Ted Dunning, Mahout in Action Leo Tolstoy, War and Peace Douglas Adams, The hitchhiker guide to the galaxy. James Sununu, galaxy III for Dummies Tom McArthur, The War we went to 第二个文件是单词及其ID

我必须使用ApachePig将需要合并的文件添加到一起。第一个文件包含书名列表,就像这样,每个书名都在一行中

Ted Dunning,  Mahout in Action
Leo Tolstoy,  War and Peace
Douglas Adams, The hitchhiker guide to the galaxy.
James Sununu,  galaxy III for Dummies
Tom McArthur,  The War we went to
第二个文件是单词及其ID的列表。像这样

ted, 12
tom, 13
douglas, 14
galaxy, 15
war, 16
leo, 17
peace, 18
我需要连接这两个文件以生成如下输出:

《列夫·托尔斯泰,战争与碎片》这一行应该是这样的

17:1,16:1,18:1
13:1,16:1
对于“汤姆·麦克阿瑟,我们去的那场战争”这句台词,它应该会产生

17:1,16:1,18:1
13:1,16:1
换句话说,我需要使用单词作为键来执行连接。到目前为止,我已经用pig编写了以下代码

titles = LOAD 'Titles' AS ( title : chararray );  
termIDs = LOAD  'TermIDs' AS (  term:chararray,id:int);

A = SAMPLE titles 0.01;
X = FOREACH A GENERATE STRSPLIT(title,'[ _\\[\\]\\/,\\.\\(\\)]+');
这将提供加载的两个文件,X包含行李列表,每个行李包含相应行中出现的术语。像这样:

((ted,dunning,mahout,in,action))
((leo,tolstoy,war,and,peace))

由于周六晚上很晚,我想不出在不编写自定义项或使用流媒体的情况下加入step的方法。甚至可以只使用PIG原语

您可以展平标记化的结果,这样所有的包都成为行,现在您可以使用termsID连接X关系

X = foreach A generate title, flatten(TOKENIZE(title)) as term;
J = join X by (term),  termIDs by (term);
G = group J by title;
Result = foreach G generate group as title, termIDs.id;
上面的代码是在我的手机上输入的,所以没有调试

更新1:

对于最好使用STRSPLIT而不是TOKENIZE的情况,您可以结合使用flatte和TOBAG来实现与TOKENIZE相同的效果,即从STRSPLIT返回的元组中获取一包单词

SPLT = foreach A generate title, FLATTEN(STRSPLIT(title,'[ _\\[\\]\\/,\\.\\(\\)]+'));
X_tmp = foreach SPLT generate $0 as title, FLATTEN(TOBAG($1..$20)) as term; -- pivots the row
X = filter X_tmp by term is not null; -- this removes the extra bag rows when title was split in less than 20 terms
J = join X by (term),  termIDs by (term) using 'replicated';
G = group J by title;
Result = foreach G generate group as title, termIDs.id;

如果任何标题超过20个术语,则增加TOBAG中的数字。

每个标题的ID顺序重要吗?不,我不关心顺序。此输出将用于聚类/分类算法。谢谢。这是朝着正确方向迈出的一步。我只关心两件事。“标题”实际上相当长,因此这样做会使存储需求增加一倍,但至少它能完成任务。第二个更严重。我不能使用TOKENIZE,因为术语之间没有用空格很好地分隔。我实际上必须使用上面的正则表达式。我想我可以写一个UDF来处理这个问题。无论如何,要解决不使用TOKENIZE的最大问题,请参阅更新1。