使用Pig加载文件的子集

时间:2013-06-17 20:20:22

标签: csv hadoop nosql apache-pig

我正在玩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上的ram来说有点太大了..

我想知道是否可以LOADcsv文件的子集?

这样的事情是可能的:

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

2 个答案:

答案 0 :(得分:1)

在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中传递多个文件,因此您也可以从Hadoop shell中调出文件名。

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

答案 1 :(得分: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,这可以解决您的问题。