例如:hdfs中以制表符分隔的表有以下字段:col1、col2、col3、col4。我只想在pig中装入col1和col2。以下load语句不起作用:使用pigstorage('\t')as(col1:chararray,col2:chararray)加载'/usr/table1';
nwnhqdif1#
一种解决方案是,您可以将这两列数据写入一个新文件,并将数据加载到pig中。在这里您可以使用一些awk命令来实现这一点。
Hadoop fs -cat /usr/table1 |awk -f "\t" {print $1,$2} >>newfile.tsv
第二种解决方案是加载4列数据只生成2列数据并使用它们。
A = LOAD '/usr/table1' USING PigStorage ('\t') as (Col1:chararray, Col2:chararray,Col3:chararray, Col4:chararray);B = foreach A generate col1,col2 ;store b into '/path/to/hdfs';
A = LOAD '/usr/table1' USING PigStorage ('\t') as (Col1:chararray, Col2:chararray,Col3:chararray, Col4:chararray);
B = foreach A generate col1,col2 ;
store b into '/path/to/hdfs';
d5vmydt92#
首先必须将表文件移到本地目录中,然后才能在pig脚本中使用它
hdfs dfs -copyToLocal /usr/table1 $HOME/tables/
在咕噜shell中运行下面的代码
A=LOAD '$HOME/tables/table1' using PigStorage('\t') as (Col1:chararray, Col2:chararray,Col3:chararray, Col4:chararray);B= foreach A generate $0 as col1,$1 as col2;Dump B;
A=LOAD '$HOME/tables/table1' using PigStorage('\t') as (Col1:chararray, Col2:chararray,Col3:chararray, Col4:chararray);
B= foreach A generate $0 as col1,$1 as col2;
Dump B;
snvhrwxg3#
你不能只加载这两个字段,但你不必命名所有的字段。
A = LOAD '/usr/table1' USING PigStorage ('\t');B = FOREACH A GENERATE $0 as col1, $1 as col2;
A = LOAD '/usr/table1' USING PigStorage ('\t');
B = FOREACH A GENERATE $0 as col1, $1 as col2;
当您提前生成时,pig生成的map/reduce(s)中的进一步步骤将不会产生移动附加列的成本。同样假设文件很大,我不会使用建议的cat和awk选项,因为这不会像使用pig那样有效(如果文件比map/reduce小,通常效率会很低)
3条答案
按热度按时间nwnhqdif1#
一种解决方案是,您可以将这两列数据写入一个新文件,并将数据加载到pig中。
在这里您可以使用一些awk命令来实现这一点。
第二种解决方案是加载4列数据只生成2列数据并使用它们。
d5vmydt92#
首先必须将表文件移到本地目录中,然后才能在pig脚本中使用它
在咕噜shell中运行下面的代码
snvhrwxg3#
你不能只加载这两个字段,但你不必命名所有的字段。
当您提前生成时,pig生成的map/reduce(s)中的进一步步骤将不会产生移动附加列的成本。同样假设文件很大,我不会使用建议的cat和awk选项,因为这不会像使用pig那样有效(如果文件比map/reduce小,通常效率会很低)