10

我在将数据从 pig 中获取到 CSV 中时遇到了很多麻烦,我可以在 Excel 或 SQL(或 R 或​​ SPSS 等)中使用而无需进行大量操作......

我试过使用以下功能:

STORE pig_object INTO '/Users/Name/Folder/pig_object.csv'
    USING CSVExcelStorage(',','NO_MULTILINE','WINDOWS');

它使用该名称创建包含大量 part-m-0000# 文件的文件夹。稍后我可以使用 cat part* > filename.csv 将它们全部加入,但没有标题,这意味着我必须手动输入。

我读过 PigStorageSchema 应该创建另一个带有标题的位,但它似乎根本不起作用,例如,我得到的结果就像它只是存储一样,没有头文件:STORE pig_object INTO '/Users/名称/文件夹/pig_object' 使用 org.apache.pig.piggybank.storage.PigStorageSchema();

(我在本地和 mapreduce 模式下都试过了)。

有没有任何方法可以在没有这些多个步骤的情况下将 Pig 中的数据转换为简单的 CSV 文件?

任何帮助将非常感激!

4

2 回答 2

32

恐怕没有一个单线可以完成这项工作,但您可以提出以下建议(Pig v0.10.0):

A = load '/user/hadoop/csvinput/somedata.txt' using PigStorage(',') 
      as (firstname:chararray, lastname:chararray, age:int, location:chararray);
store A into '/user/hadoop/csvoutput' using PigStorage('\t','-schema');

PigStorage 使用' -schema' 时,它将在输出目录中创建一个 ' .pig_schema' 和一个 ' '。.pig_header然后你必须将 ' .pig_header' 与 ' part-x-xxxxx' 合并:

1.如果需要将结果复制到本地磁盘:

hadoop fs -rm /user/hadoop/csvoutput/.pig_schema
hadoop fs -getmerge /user/hadoop/csvoutput ./output.csv

(由于-getmerge需要一个输入目录,您需要先摆脱.pig_schema

2.将结果存储在 HDFS 上:

hadoop fs -cat /user/hadoop/csvoutput/.pig_header 
  /user/hadoop/csvoutput/part-x-xxxxx | 
    hadoop fs -put - /user/hadoop/csvoutput/result/output.csv

如需进一步参考,您还可以查看以下帖子:
将输出存储到单个 CSV?
如何使用 Hadoop FS shell 将 hadoop 中的两个文件连接成一个文件?

于 2012-12-04T12:03:26.123 回答
1

如果您将数据存储PigStorage在 HDFS 上,然后使用以下方法进行合并-getmerge -nl

STORE pig_object INTO '/user/hadoop/csvoutput/pig_object'
    using PigStorage('\t','-schema');
fs -getmerge -nl /user/hadoop/csvoutput/pig_object  /Users/Name/Folder/pig_object.csv;

文件:

可选 -nl 可以设置为在每个文件的末尾添加换行符 (LF)。

您将拥有一个具有以下结构的 TSV/CSV 文件:

1 - header
2 - empty line
3 - pig schema
4 - empty line
5 - 1st line of DATA
6 - 2nd line of DATA
...

所以我们可以简单地[2,3,4]使用 AWK 删除行:

awk 'NR==1 || NR>4 {print}' /Users/Name/Folder/pig_object.csv > /Users/Name/Folder/pig_object_clean.csv
于 2016-04-26T16:56:50.163 回答