【问题标题】:Insert into Hive struct column by spilitting hive columns from other table通过从其他表中拆分配置单元列插入到配置单元结构列
【发布时间】:2017-07-02 00:42:30
【问题描述】:

我有以下要求,我想使用 Hive 来实现。

  1. 具有结构 1 列的表 A。
  2. 创建表 B 以拆分表 A 的 Struct 列并加载为 2 个不同的列。

以下是我尝试过的 DDL 和步骤。

A 表:

来自反序列化器的集群字符串
来自反序列化器的架构字符串
来自反序列化器的表字符串
来自反序列化器的主键结构
来自反序列化器的数据结构
从反序列化器中删除的布尔值
从反序列化器截断布尔值
来自反序列化器的版本 bigint

表 B: 来自反序列化器的 user_id 字符串
运输属性结构 billingattr 结构体

我尝试了以下方法。

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) 在 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) 在 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) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:606) 在 org.apache.hadoop.util.RunJar.main(RunJar.java:212) 失败:ParseException line 1:50 无法识别 select 子句中 '(' 'user_id' ',' 附近的输入

【问题讨论】:

  • 向我们展示错误。
  • @strugee,更新了错误消息。不确定这是否是插入结构数据类型的正确方法。

标签: select struct insert hive


【解决方案1】:

谢谢你的建议,我是这样实现的。

插入表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;

感谢和问候, 斯里维涅什 KN

【讨论】:

    【解决方案2】:

    以上场景可以如下处理。在结构中插入数据的示例:-

    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;
    

    【讨论】:

      【解决方案3】:

      首先,Hive 不包含用于插入的列列表。
      应按顺序插入所有列。

      insert into Table B
      select ...
      

      【讨论】:

        猜你喜欢
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        • 2020-07-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        相关资源
        最近更新 更多