我有如下的猪关系:
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>
提前致谢,
答案 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!