我正在玩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来说有点太大了..
我想知道是否可以LOAD
。csv
文件的子集?
这样的事情是可能的:
LOAD 'googlebooks-eng-all-3gram-20090715-0.csv' using PigStorage('\t') LOAD ONLY FIRST 100MB?
答案 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,这可以解决您的问题。