7

我有名为 part-r-000[0-9][0-9] 并且包含制表符分隔字段的文件。我可以使用查看它们,hadoop fs -text part-r-00000但无法使用 pig 加载它们。

我试过的:

x = load 'part-r-00000';
dump x;
x = load 'part-r-00000' using TextLoader();
dump x;

但这只会给我垃圾。如何使用 pig 查看文件?

可能相关的是我的 hdfs 目前仍在使用 CDH-2。此外,如果我将文件下载到本地并运行file part-r-00000它说part-r-00000: data,我不知道如何在本地解压缩。

4

2 回答 2

4

根据HDFS 文档hadoop fs -text <file>可用于“zip 和 TextRecordInputStream”数据,因此您的数据可能是其中一种格式。

如果文件被压缩了,通常 Hadoop 会在输出到 HDFS 时添加扩展名,但如果缺少这个,您可以尝试在本地解压缩/ungzipping/unbzip2ing/etc 进行测试。看起来 Pig 应该自动解压缩,但可能需要存在文件扩展名(例如 part-r-00000.zip)——更多信息

我不太确定 TextRecordInputStream .. 听起来它只是 Pig 的默认方法,但我可能是错的。当我快速谷歌时,我没有看到任何关于通过 Pig 加载这些数据的内容。

更新: 由于您发现它是一个序列文件,因此您可以使用 PiggyBank 加载它:

-- using Cloudera directory structure:
REGISTER /usr/lib/pig/contrib/piggybank/java/piggybank.jar
--REGISTER /home/hadoop/lib/pig/piggybank.jar
DEFINE SequenceFileLoader org.apache.pig.piggybank.storage.SequenceFileLoader();


-- Sample job: grab counts of tweets by day
A = LOAD 'mydir/part-r-000{00..99}' # not sure if pig likes the {00..99} syntax, but worth a shot 
    USING SequenceFileLoader AS (key:long, val:long, etc.);
于 2012-09-06T02:20:43.960 回答
3

如果您想操作(读/写)序列文件,Pig那么您也可以尝试使用 Twitter 的Elephant-Bird

您可以在此处找到如何读取/写入它们的示例。

如果您在序列文件中使用自定义 Writables,那么您可以通过扩展AbstractWritableConverter来实现自定义转换器。

请注意,这Elephant-Bird需要在您的机器上安装Thrift 。在构建它之前,请确保它使用您拥有的正确 Thrift 版本,并在其pom.xml中提供 Thrift 可执行文件的正确路径:

<plugin>
  <groupId>org.apache.thrift.tools</groupId>
  <artifactId>maven-thrift-plugin</artifactId>
  <version>0.1.10</version>
  <configuration>
    <thriftExecutable>/path_to_thrift/thrift</thriftExecutable>
  </configuration>
</plugin>
于 2012-09-06T14:06:24.003 回答