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 加载显示良好的文件的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 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