如何将数据类型为array的列插入配置单元表< struct< int>>

h7appiyu  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(342)

我正在尝试将数据插入到我创建的配置单元中的表中。我一直在努力,所以我尽量简化它,以找到问题的根源。
下面是我创建基本表的简化代码。我基本上有一个单一元素的结构数组。

DROP TABLE IF EXISTS foo.S_FILE_PA_JOB_DATA_T;

CREATE TABLE foo.S_FILE_PA_JOB_DATA_T
  PARTITIONED BY (customer_id string)
  STORED AS AVRO
  TBLPROPERTIES (
 'avro.schema.literal'=
 '{
   "namespace": "com.foo.oozie.foo",
   "name": "S_FILE_PA_JOB_DATA_T",
   "type": "record",
   "fields":
   [
      {"name":"pa_hwm"             ,"type":{
         "type":"array",
         "items":{
           "type":"record",
           "name":"pa_hwm_record",
           "fields":
           [
             {"name":"pa_axis"           ,"type":["int","null"]}
           ]
         }
      }}
   ]
   }');

我的问题是我搞不懂要插入到表中的语法。

insert into table foo.s_FILE_PA_JOB_DATA_T partition (customer_id) values (0,'a390c1cf-4ee5-4ab9-b7a3-73f5f268b669')

这个 0 需要成为一个 array<struct<int>> 但我不懂语法。有人能帮忙吗?谢谢!

ymdaylpp

ymdaylpp1#

不幸的是,你不能直接这么做。另请参见配置单元向数组复杂类型列插入值。
从理论上讲,你应该可以用

insert into table s_file_pa_job_data_t partition(customer_id)  
  values (array(named_struct('pa_axis',0)) );

也就是说,使用 array() 以及 named_struct() UDF将根据一些标量值分别构造一个数组和一个结构(请参见此处的自定义项文档:https://cwiki.apache.org/confluence/display/hive/languagemanual+udf#languagemanualudf-复杂类型构造函数
但不幸的是如果你这么做你会

FAILED: SemanticException [Error 10293]: Unable to create temp file 
for insert values Expression of type TOK_FUNCTION not supported in insert/values

因为不幸的是,hive不支持在 VALUES 条款还没有。正如其他帖子所建议的,您可以使用一个虚拟表来实现它,这有点难看,但是很有效。

相关问题