如何使用不同的 PigStorage 运算符将数据加载到猪中

Posted

技术标签:

【中文标题】如何使用不同的 PigStorage 运算符将数据加载到猪中【英文标题】:How to load data into pig using different PigStorage operator 【发布时间】:2017-04-17 13:22:58 【问题描述】:

我是 Apache Pig 的新手,正在尝试加载测试推特数据以找出每个用户名的推文数量。以下是我的数据

format(twitterId,comment,userRefId):

Sample Data

当我尝试使用 PigStorage 作为 (',') 将数据加载到 Pig 中时,它会将我的评论部分也分成多个字段,因为 cmets 也可能有','。请让我知道如何在 Pig 中正确加载这些数据。我正在使用以下命令:

data = LOAD '/home/vinita/Desktop/Material/PIG/test.csv' using PigStorage(',') AS (id:chararray,comment:chararray,refId:chararray);

【问题讨论】:

是否可以修改源数据以使用不同的分隔符? @darkownage:是的 【参考方案1】:

将记录加载到一行中,然后用 | 和 ", 替换为 |。这将确保字段分开,然后使用 STRSPLIT 获取 3 个字段。

A = LOAD 'data.txt' AS (line:chararray);
B = FOREACH A GENERATE REPLACE(REPLACE(line,',"','|'),'",','|');
C = FOREACH B GENERATE STRSPLIT($0,'\\|',3);
DUMP C;

编辑: 我使用示例文本来运行脚本并且工作正常。见下文

【讨论】:

将数据作为一行加载时,它只加载行中的第一个字段值,而不是整个数据... :( @VinitaGupta 你的加载语句是什么样的?不要使用 PigStorage。 @inquistive_mind 我使用以下语句将数据加载为行:X = LOAD '/home/vinita/Desktop/Material/PIG/test1.csv' using PigStorage(',') AS (line :chararray); 不正确,应该是 X = LOAD '/home/vinita/Desktop/Material/PIG/test1.csv' AS (line:chararray); @inquistive_mind 感谢您的纠正 :) 我已经按照您的建议加载了数据,并用 | 和 ", 替换了 |之后替换为“|”和 ','。但现在它将数据视为单列数据而不是 3 列。因此,我无法按用户名对数据进行分组,以按每个用户名计算推文数。【参考方案2】:

如果可以选择更改源数据中的分隔符,我会走这条路。可能更容易上手和追踪问题。

如果您将分隔符更改为 |,您的代码可能如下所示:

data = LOAD '/home/vinita/Desktop/Material/PIG/test.csv' using PigStorage('|') AS (id:chararray,comment:chararray,refId:chararray);

【讨论】:

我想在不改变源数据的情况下解决这个问题,如果可以的话请告诉我

以上是关于如何使用不同的 PigStorage 运算符将数据加载到猪中的主要内容,如果未能解决你的问题,请参考以下文章

pig 不使用 PigStorage 加载地图数据

Pig:无法使用 PigStorage 加载数据

使用 PigStorage 加载缺少最后一个字段的数据

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

如何在猪中加载由 :: 分隔的数据

如何在 piglatin 中每次加载具有不同分隔符的文件