使用 Pig 加载文件的子集

Posted

技术标签:

【中文标题】使用 Pig 加载文件的子集【英文标题】:loading a subset of a file using Pig 【发布时间】:2013-06-17 20:20:22 【问题描述】:

我正在玩 hortonworks 沙盒来学习 hadoop 等。

我正在尝试在单机“集群”上加载文件:

A = LOAD 'googlebooks-eng-all-3gram-20090715-0.csv' using PigStorage('\t')
AS (ngram:chararray, year:int, count1:int, count2:int, count3:int);
B = LIMIT A 10;
Dump B;

不幸的是,该文件对于我的 VM 上的内存来说有点太大了..

我想知道是否可以 LOAD .csv 文件的子集?

这样的事情可能吗:

LOAD 'googlebooks-eng-all-3gram-20090715-0.csv' using PigStorage('\t') LOAD ONLY FIRST 100MB?

【问题讨论】:

【参考方案1】:

为什么需要将整个文件加载到 RAM 中?无论您需要多少内存,您都应该能够运行整个文件。尝试将其添加到脚本的顶部:

--avoid java.lang.OutOfMemoryError: Java heap space (execmode: -x local)
set io.sort.mb 10;

您的猪脚本现在将显示为:

--avoid java.lang.OutOfMemoryError: Java heap space (execmode: -x local)
set io.sort.mb 10;
A = LOAD 'googlebooks-eng-all-3gram-20090715-0.csv' using PigStorage('\t')
AS (ngram:chararray, year:int, count1:int, count2:int, count3:int);
B = LIMIT A 10;
Dump B;

假设您在运行脚本时刚刚收到 OutOfMemoryError,这应该可以解决您的问题。

【讨论】:

非常感谢。我实际上还不知道如何检查日志。我对此完全陌生。我不知道问题是什么,但这现在对我有用!你能告诉我 set io.sort 是做什么的吗? 它只是改变了作业排序阶段使用的内存量。由于该作业最多仅使用 10MB,因此您可以确保不会耗尽内存。在真实情况下(使用真实集群),您显然不想限制可以使用的内存量。 没问题!我最近一直在使用 Hadoop/Pig,并且即将开始使用 MongoDB。我是一名研究人员,所以我使用的工具往往会随着时间而变化。到目前为止还没有真正坚持一件事:) 酷!有兴趣一起工作吗?我来自传统的 RDBMS 背景,拥有丰富的编程经验。我正在尝试设置一个 hortonworks 集群 我很乐意,但不幸的是,我正在同时从事其他几个项目。我宁愿不要把自己摊得太薄。不过,也许在未来!【参考方案2】:

您在 Hadoop 中定义解决方案的方式是不可能的,但是如果您可以在 OS Shell 而非 Hadoop shell 中实现您的目标。在 Linux shell 中,您可以编写一个脚本从源文件中读取前 100MB,将其保存到本地文件系统,然后用作 Pig 源。

#Script .sh
# Read file and save 100 MB content in file system
# Create N files of 100MB each
# write a pig_script to process your data as shown below
# Launch Pig script and pass the N files as parameter as below: 
pig -f pigscript.pig -param inputparm=/user/currentuser/File1.File2,..,FileN

#pigscript.pig 
A = LOAD '$inputparm' using PigStorage('\t') AS (ngram:chararray, year:int, count1:int, count2:int, count3:int); 
B = LIMIT A 10; 
Dump B;

一般情况下,多个文件可以通过其名称在 Hadoop shell 中传递,因此您也可以从 Hadoop shell 中调用文件名。

这里的关键是,在 Pig 中,没有从文件和进程中读取 x 的默认方法,它是全有或全无,因此您可能需要找到解决方法来实现您的目标。

【讨论】:

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

Pig:使用外部模式文件加载数据文件

如何使用 PIG 加载文件夹中的每个文件?

使用 Pig 加载默认转储文件

如何使用 apache pig 递归加载文件

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

使用 Pig 操作 CSV 文件