使用 Pig 操作 CSV 文件

Posted

技术标签:

【中文标题】使用 Pig 操作 CSV 文件【英文标题】:Manipulate a CSV file using Pig 【发布时间】:2013-08-20 23:49:44 【问题描述】:

我尝试使用以下命令使用 Pig 加载 CSV 文件:

A = LOAD '/USER/XYZ/PIG/FILENAME.ASC' USING PIGSTORAGE(',');

当它加载并没有出现错误时,cat a 给了我一个Directory does not exist error。我是 Pig 的新手,知道我在那里做错了什么。如何检查它是否确实已加载?还是加载了一个用词不当,文件只存在于 HDFS 上?

接下来,我想从 CSV 文件中截取几列数据并将其存储在另一个文件中。我该怎么办?

我不一定需要脚本/代码,但如果您能指出正确的功能来完成我想做的事情,那就太好了。谢谢!

【问题讨论】:

【参考方案1】:

要查看A 的当前内容,您可以使用DUMPA;。要查看架构/关系,您可以使用DESCRIBEA;

一旦您知道A 的架构,您就可以投影出您想要的字段。例如。 B = FOREACH A GENERATE $0 AS foo, $4 AS bar ; 仅选择第 1 列和第 5 列,分别命名为 foo 和 bar。

可以使用STOREB INTO 'myoutdir' USING PigStorage('|') ; 完成存储,其中您选择作为分隔符的字符可以是任何单个字符。

所以,例如,这是我测试脚本时脚本的外观:

A = LOAD '/USER/XYZ/PIG/FILENAME.ASC' USING PIGSTORAGE(',') ;
DESCRIBE A ;
DUMP A ;

B = FOREACH A GENERATE $0, $4;
DESCRIBE B ;
DUMP B ;

STORE B INTO 'myoutdir' USING PigStorage('|') ;

【讨论】:

感谢您的完美回答!我去度假了,直到昨天才测试你的代码。你会碰巧知道如何处理多个文件吗?像.. 如果是 file1,则给出第 2-8 列,如果是 file2,则给出第 4-6 列等,还是通过使用 Java/Python 编写的脚本更好地实现? @CodingInCircles 您需要加载多少个文件?您始终可以单独LOAD 每个文件,然后为每个别名投影出相应的字段。 大约有 100-150 个文件,未来可能会更多。要维护这么多变量/占位符,这可能不是一个挑战吗?

以上是关于使用 Pig 操作 CSV 文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 pig 从 csv 文件中读取数据

如何在 PIG 中将 XLSX 文件转换为 CSV 文件?

在 Pig 中将输出存储到 CSV 文件

使用 Pig 加载 CSV

csv 在 pig 中读取,csv 文件包含带引号的逗号

使用 PIG 或 HIVE 从 CSV 中删除前两行