例如:我在 HDFS 中的制表符分隔表具有以下字段:Col1、Col2、Col3、Col4。我只想在 PIG 中加载 Col1 和 Col2。以下 LOAD 语句不起作用:
LOAD '/usr/table1' 使用 PigStorage ('\t') as (Col1:chararray, Col2:chararray);
例如:我在 HDFS 中的制表符分隔表具有以下字段:Col1、Col2、Col3、Col4。我只想在 PIG 中加载 Col1 和 Col2。以下 LOAD 语句不起作用:
LOAD '/usr/table1' 使用 PigStorage ('\t') as (Col1:chararray, Col2:chararray);
一种解决方案是您可以将这两列数据写入新文件并将数据加载到 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');
B = FOREACH A GENERATE $0 as col1, $1 as col2;
当您尽早执行生成时,pig 生成的 map/reduce(s) 中的进一步步骤不会产生移动附加列的成本另外假设文件很大,我不会使用建议的 cat 和 awk 选项,因为这个不会像使用 pig 那样有效(如果文件比 map/reduce 小,通常效率会低下)
首先你必须将表文件移动到本地目录,然后你可以在猪脚本中使用它
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;