Apache Pig:使用 hadoop fs -text 加载显示良好的文件

Posted

技术标签:

【中文标题】Apache Pig:使用 hadoop fs -text 加载显示良好的文件【英文标题】:Apache Pig: Load a file that shows fine using hadoop fs -text 【发布时间】:2012-09-05 17:34:55 【问题描述】:

我有名为 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,我不知道如何在本地解压缩。

【问题讨论】:

我相信你的第一个 load 使用 PigStorage,但也许你可以通过明确的方式仔细检查,x = LOAD 'part-r-00000' USING USING PigStorage('\t')。当您在本地下载文件时,如果您查看它(即tail),它是垃圾/二进制文件吗?您能举出生成此数据的代码示例吗? 明确使用 PigStorage 会得到相同的结果。下载到本地(使用 -get 或 -copyToLocal)文件不可读,即。 e.二进制/垃圾(少或尾)。我会尝试找到创建这些文件的代码并报告。 该文件似乎已存储为序列文件。我已经能够使用用户定义的加载函数从中提取行。有没有比使用 udf 更简单的方法? 我用与序列文件相关的示例代码更新了我的答案。希望有帮助:) 【参考方案1】:

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

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

我不太确定 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-00000..99' # not sure if pig likes the 00..99 syntax, but worth a shot 
    USING SequenceFileLoader AS (key:long, val:long, etc.);

【讨论】:

00..99 不起作用,所以我只是使用 * 代替。之后可以使用B = FOREACH A GENERATE flatten(STRSPLIT (val, '\t')) AS (etc.) 读取该行,因为 SequenceFileLoader 只返回两列。【参考方案2】:

如果你想用Pig 操作(读/写)序列文件,那么你也可以试试推特的Elephant-Bird。

您可以找到here 示例如何读取/写入它们。

如果您在序列文件中使用自定义 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>

【讨论】:

以上是关于Apache Pig:使用 hadoop fs -text 加载显示良好的文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在hadoop pig中执行-fs

如何使用 apache pig 在 hadoop 集群上加载文件?

PIG - 找到接口 org.apache.hadoop.mapreduce.JobContext,但预期类

Pig 0.13 错误 2998:未处理的内部错误。 org/apache/hadoop/mapreduce/task/JobContextImpl

Apache pig 错误 org.apache.pig.backend.hadoop.executionengine.Launcher - 错误:org.apache.avro.file.DataF

使用 Apache Hadoop Pig 内连接两个数据集