如何使用不同的 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 运算符将数据加载到猪中的主要内容,如果未能解决你的问题,请参考以下文章