通过从其他表

时间:2017-02-13 21:41:50

标签: select struct insert hive

我有以下要求,我希望使用Hive。

  1. 表A包含Struct 1列。
  2. 创建表B以拆分表A的Struct列并加载为2个不同的列。
  3. 下面是DDL以及我尝试过的步骤。

    表A:

    来自反序列化器的

    簇字符串
    来自反序列化器的模式字符串
    来自反序列化器的表字符串
    来自反序列化器的primarykey结构体 反序列化器的数据结构 从反序列化器中删除了布尔值 从反序列化器中截断布尔值 来自反序列化器的版本bigint

    表B: 来自反序列化器的user_id字符串
    shippingattr结构 billingattr struct

    我尝试了以下内容。

    insert into Table B
    (
    user_id,
    shippingattr.username,
    shippingattr.shipping_fname,
    shippingattr.shipping_lname,
    shippingattr.shipping_address,
    shippingattr.shipping_address2,
    shippingattr.shipping_city,
    shippingattr.shipping_state,
    shippingattr.shipping_zip,
    shippingattr.phone,
    billingattr.billing_is_shipping,
    billingattr.billing_fname,
    billingattr.billing_lname,
    billingattr.billing_address,
    billingattr.billing_address2,
    billingattr.billing_city,
    billingattr.billing_state,
    billingattr.billing_zip
    )
    
    select 
    primarykey.user_id,
    data.username,
    data.shipping_fname,
    data.shipping_lname,
    data.shipping_address,
    data.shipping_address2,
    data.shipping_city,
    data.shipping_state,
    data.shipping_zip,
    data.phone,
    data.billing_is_shipping,
    data.billing_fname,
    data.billing_lname,
    data.billing_address,
    data.billing_address2,
    data.billing_city,
    data.billing_state,
    data.billing_zip
    from Table A;
    

    但是出错了,请您告诉我插入这些数据的正确方法。

    错误消息:     NoViableAltException(284 @ [])     在org.apache.hadoop.hive.ql.parse.HiveParser_SelectClauseParser.selectClause(HiveParser_SelectClauseParser.java:742)     在org.apache.hadoop.hive.ql.parse.HiveParser.selectClause(HiveParser.java:40147)     at org.apache.hadoop.hive.ql.parse.HiveParser.singleSelectStatement(HiveParser.java:38048)         在org.apache.hadoop.hive.ql.parse.HiveParser.selectStatement(HiveParser.java:37754)     在org.apache.hadoop.hive.ql.parse.HiveParser.regularBody(HiveParser.java:37654)     at org.apache.hadoop.hive.ql.parse.HiveParser.queryStatementExpressionBody(HiveParser.java:36898)     在org.apache.hadoop.hive.ql.parse.HiveParser.queryStatementExpression(HiveParser.java:36774)     在org.apache.hadoop.hive.ql.parse.HiveParser.execStatement(HiveParser.java:1338)     在org.apache.hadoop.hive.ql.parse.HiveParser.statement(HiveParser.java:1036)     在org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:199)     在org.apache.hadoop.hive.ql.parse.ParseDriver.parse(ParseDriver.java:166)     在org.apache.hadoop.hive.ql.Driver.compile(Driver.java:404)     在org.apache.hadoop.hive.ql.Driver.compile(Driver.java:322)     在org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:975)     在org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1040)     在org.apache.hadoop.hive.ql.Driver.run(Driver.java:911)     在org.apache.hadoop.hive.ql.Driver.run(Driver.java:901)     在org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:275)     在org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:227)     在org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:430)     在org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:803)     在org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:697)     在org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:636)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     at java.lang.reflect.Method.invoke(Method.java:606)     在org.apache.hadoop.util.RunJar.main(RunJar.java:212) FAILED:ParseException行1:50无法识别'(''user_id'','在select子句中''附近的输入

3 个答案:

答案 0 :(得分:0)

首先,Hive除了插入的列列表外没有 应按顺序插入所有列。

insert into Table B
select ...

答案 1 :(得分:0)

以上情景可以按如下方式处理。在struct中插入数据的示例: -

create table xyz (a STRUCT<x : int , y :String , z:int , zz : int >, b string );

 insert into table xyz select named_STRUCT(x,12,y,'text',z,2,zz,3) , 'text' from dummy limit 1;

 create table xyz1 (a1 STRUCT<x : int , y :String > , a2 struct<z:int , zz : int> , b String);

 insert into table xyz1  select named_struct('x',a.x,'y',a.y) ,named_struct('z',a.z,'zz',a.zz) ,b from xyz;

insert into table xyz1(a1,a2,b)  select named_struct('x',a.x,'y',a.y) ,named_struct('z',a.z,'zz',a.zz) , b from xyz;

答案 2 :(得分:0)

感谢您的建议,我已经这样实现了。

在表B中插入选择user_id, named_struct('username',Table2.data.username,'shipping_fname',Table2.data.shipping_fname,......)作为shippingattr, named_struct('billing_is_shipping',Table2.data.billing_is_shipping,.....,'billing_zip',Table2.data.billing_zip)作为billingattr 来自表A;

谢谢&amp;问候, Srivignesh KN