PIG:如何删除列名中的“::”

时间:2016-08-11 16:49:21

标签: hadoop apache-pig

我有如下的猪关系:

FINAL = {input_md5::type: chararray,input_md5::name: chararray,input_md5::id: long,input_md5::age: chararray,test_1:: type: chararray,test_2::name:chararray}

我正在尝试将input_md5关系的所有列存储到配置单元表中。 像所有input_md5::type: chararray,input_md5::name: chararray,input_md5::id: long,input_md5::age: chararray没有取test_1:: type: chararray,test_2::name:chararray

一样

是否猪中有任何命令仅过滤input_md5的列。如下所示:

STORE= FOREACH FINAL GENERATE all input_md5::type . 我知道猪有:

FOREACH FINAL GENERATE all input_md5::type as type语法,但我有很多列,因此我无法在代码中使用as

因为当我尝试: STORE= FOREACH FINAL GENERATE input_md5::type .. bus_input_md5::name;

Pig抛出错误:

org.apache.hive.hcatalog.common.HCatException : 2007 : Invalid column position in partition schema : Expected column <type> at position 1, found column <input_md5::type>

提前致谢,

2 个答案:

答案 0 :(得分:5)

解决了这个问题,下面是修复:

使用以下某些过滤条件创建关系:

DUMMY_RELATION= FILTER SOURCE_TABLE BY type== '';(我选了一个名为type的列,这可以通过表中的任何列进行过滤,重要的是我们需要它的模式)

FINAL_DATASET= UNION DUMMY_RELATION,SCHEMA_1,SCHEMA_2;

(这个新的DUMMY_RELATION n应该在联盟中排在第1位) 现在您不再拥有::运算符如果您的源表(到DUMMY_RELATION)和目标表具有相同的列顺序,您的列名将匹配hive表的列名。

感谢自己:)

答案 1 :(得分:2)

我用这种方式实施了Neethu的例子。可能有拼写错误,但它显示了如何实现这个想法。

tableA = LOAD 'default.tableA' USING org.apache.hive.hcatalog.pig.HCatLoader();
tableB = LOAD 'default.tableB' USING org.apache.hive.hcatalog.pig.HCatLoader();

--load empty table
finalTable = LOAD 'default.finalTable' USING org.apache.hive.hcatalog.pig.HCatLoader();

--example operations that end up with '::' in column names
g = group tableB by (id);
j = JOIN tableA by id LEFT, g by group;
result = foreach j generate tableA::id, tableA::col2, g::tableB;

--union empty finalTable and result
result2 = union finalTable, result;

--bob's your uncle
STORE result2 INTO 'finalTable' USING org.apache.hive.hcatalog.pig.HCatStorer();

感谢Neethu!