我可以将HDFS中的部分表加载到PIG中吗?

时间:2013-06-12 00:34:57

标签: load apache-pig hdfs

例如:HDFS中的我的制表符分隔表包含以下字段:Col1,Col2,Col3,Col4。我想只在PIG中加载Col1和Col2。以下LOAD语句不起作用:

LOAD'/ usr / table1'使用PigStorage('\ t')作为 (Col1中:chararray, COL2:chararray);

3 个答案:

答案 0 :(得分:3)

一种解决方案是您可以将这两列数据写入新文件并将数据加载到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';

答案 1 :(得分:2)

您不能只加载这两个字段,但不必命名所有字段 即

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一般会效率低)

答案 2 :(得分:0)

首先你必须将表文件移动到本地目录,然后你可以在猪脚本中使用它

hdfs dfs -copyToLocal /usr/table1 $HOME/tables/

并在grunt 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;