在hive中加载struct或任何其他复杂数据类型

时间:2015-06-05 10:19:22

标签: hadoop hive hiveql

我有一个.xlsx文件,其中包含数据,如下图所示,我尝试使用以下创建查询进行创建

CREATE TABLE aus_aboriginal(
    code int,
    area_name string,
    male_0_4 STRUCT<num:double, total:double, perc:double>,
    male_5_9 STRUCT<num:double, total:double, perc:double>,
    male_10_14 STRUCT<num:double, total:double, perc:double>,
    male_15_19 STRUCT<num:double, total:double, perc:double>,
    male_20_24 STRUCT<num:double, total:double, perc:double>,
    male_25_29 STRUCT<num:double, total:double, perc:double>,
    male_30_34 STRUCT<num:double, total:double, perc:double>,
    male_35_39 STRUCT<num:double, total:double, perc:double>,
    male_40_44 STRUCT<num:double, total:double, perc:double>,
    male_45_49 STRUCT<num:double, total:double, perc:double>,
    male_50_54 STRUCT<num:double, total:double, perc:double>,
    male_55_59 STRUCT<num:double, total:double, perc:double>,
    male_60_64 STRUCT<num:double, total:double, perc:double>,
    male_above_65 STRUCT<num:double, total:double, perc:double>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t';

当我将数据加载到其中时,我得到nulls enter image description here我在CREATE TABLE..中遗漏了什么?

3 个答案:

答案 0 :(得分:7)

在使用像struct这样的复杂类型时,建议使用唯一的分隔符来进行收集,而不是使用字段(列)。 考虑以下格式的csv文件,其中使用“,”逗号分隔符。 的 Input.csv

  

Code,area_name,num,total,perc,num,total,perc,num,total,perc   1100,奥尔伯里,90,444,17.4,73,546,13.4,86,546,15.8

     

1111,armid,40,404,14.4,97,701,13.8,76,701,10.8

预期的结果是创建一个字段外的复杂类型(num,total和perc):

  

1100,奥尔伯里,结构&LT; 90,444,17.4&GT;,结构&LT; 73,546,13.4&GT;,结构&LT; 86,546,15.8&GT;

     1111,armid,struct&lt; 40,404,14.4&gt;,struct&lt; 97,701,13.8&gt;,struct&lt; 76,701,10.8&gt;

当我们尝试使用以下hive查询在字段(num,total和perc)中创建复杂类型时,我们将在表中获得多个空值,因为两者都使用相同的“,”逗号分隔符字段和集合,因此Hive查询无法按要求隔离数据。

Hive> create table aus_aboriginal( code int, area_name string, male_0_4 STRUCT<num:double, total:double, perc:double>, male_5_9 STRUCT<num:double, total:double, perc:double>, male_10_14 STRUCT<num:double, total:double, perc:double>) ROW FORMAT DELIMITED FIELDS TERMINATED BY  ',' COLLECTION ITEMS TERMINATED BY ',' LOCATION '/csv';

输出:

  

1100 Albury {&#34; num&#34;:90.0,&#34; total&#34;:null,&#34; perc&#34;:null} {&#34; num&#34;:444.0 &#34;总&#34;:NUL   l,&#34; perc&#34;:null} {&#34; num&#34;:17.4,&#34; total&#34;:null,&#34; perc&#34;:null}

     

1111 armid {&#34; num&#34;:40.0,&#34; total&#34;:null,&#34; perc&#34;:null} {&#34; num&#34;:404.0 &#34;总&#34;:NUL   l,&#34; perc&#34;:null} {&#34; num&#34;:14.4,&#34; total&#34;:null,&#34; perc&#34;:null}

     

所用时间:0.15秒,提取:2行

我怀疑你正面临这个问题。

结构的用法 现在考虑输入文件具有以下格式的数据,其中“,”逗号分隔符用于字段,而集合项“#”用作分隔符。

  

1100,奥尔伯里,90#444#17.4,73#546#13.4,86#546#15.8

     

1111,armid,40#404#14.4,97#701#13.8,76#701#10.8

在这种情况下,我们可以通过为集合项和字段指定#as delimiter来成功创建具有复杂类型的表。请查看下面的hive查询。

hive> create table aus_aboriginal( code int, area_name string, male_0_4 STRUCT<num:double, total:double, perc:double>, male_5_9 STRUCT<num:double, total:double, perc:double>, male_10_14 STRUCT<num:double, total:double, perc:double>) ROW FORMAT DELIMITED FIELDS TERMINATED BY  ',' COLLECTION ITEMS TERMINATED BY '#' LOCATION '/csv';

<强>输出:

hive> select * from aus_aboriginal;
  

1100 Albury {&#34; num&#34;:90.0,&#34; total&#34;:444.0,&#34; perc&#34;:17.4} {&#34; num&#34;:73.0 &#34;总&#34;:546。   0,&#34; perc&#34;:13.4} {&#34; num&#34;:86.0,&#34; total&#34;:546.0,&#34; perc&#34;:15.8}

     

1111 armid {&#34; num&#34;:40.0,&#34; total&#34;:404.0,&#34; perc&#34;:14.4} {&#34; num&#34;:97.0 &#34;总&#34;:701。   0,&#34; perc&#34;:13.8} {&#34; num&#34;:76.0,&#34; total&#34;:701.0,&#34; perc&#34;:10.8}

     

所用时间:0.146秒,提取:2行

对于其他复杂类型也应采取类似的方法,请参阅以下链接以获取更多信息。

<强>参考: http://edu-kinect.com/blog/2014/06/16/hive-complex-data-types-with-examples/

答案 1 :(得分:0)

您还可以在CREATE语句中为结构类型添加分隔符,如下所示:

CREATE TABLE aus_aboriginal( code INT, area_name STRING, 
male_0_4 STRUCT<num:DOUBLE, total:DOUBLE, perc:DOUBLE>, 
male_5_9 STRUCT<num:DOUBLE, total:DOUBLE, perc:DOUBLE>, 
male_10_14 STRUCT<num:DOUBLE, total:DOUBLE, perc:DOUBLE>, 
male_15_19 STRUCT<num:DOUBLE, total:DOUBLE, perc:DOUBLE>,
male_20_24 STRUCT<num:DOUBLE, total:DOUBLE, perc:DOUBLE>,
male_25_29 STRUCT<num:DOUBLE, total:DOUBLE, perc:DOUBLE>,
male_30_34 STRUCT<num:DOUBLE, total:DOUBLE, perc:DOUBLE>,
male_35_39 STRUCT<num:DOUBLE, total:DOUBLE, perc:DOUBLE>, 
male_40_44 STRUCT<num:DOUBLE, total:DOUBLE, perc:DOUBLE>, 
male_45_49 STRUCT<num:DOUBLE, total:DOUBLE, perc:DOUBLE>, 
male_50_54 STRUCT<num:DOUBLE, total:DOUBLE, perc:DOUBLE>, 
male_55_59 STRUCT<num:DOUBLE, total:DOUBLE, perc:DOUBLE>, 
male_60_64 STRUCT<num:DOUBLE, total:DOUBLE, perc:DOUBLE>, 
male_above_65 STRUCT<num:DOUBLE, total:DOUBLE, perc:DOUBLE>) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' 
COLLECTION ITEMS TERMINATED BY ':';

您可以拥有一个示例查询,例如:

SELECT code, male_0_4.num, male_0_4.total, male_0_4.perc FROM aus_aboriginal;

答案 2 :(得分:0)

使用以下方法创建配置单元表

CREATE TABLE `complex_data_types`(
  `col1` array<string>, 
  `col2` map<int,string>, 
  `col3` struct<c1:smallint,c2:varchar(30)>)
ROW FORMAT DELIMITED 
  FIELDS TERMINATED BY ',' 
  COLLECTION ITEMS TERMINATED BY '&' 
  MAP KEYS TERMINATED BY '#';

注意:联合可以采取相同的方式

创建一个csv文件:

arr1&arr2,101#map1&102#map2,11&varchar_1
arr3&arr4,103#map3&104#map4,12&varchar_2

在hive表中加载此数据:

LOAD DATA LOCAL INPATH '/home/dev/complex_data.csv' into table complex_data_types;

注意:假设文件位于/home/dev/complex_data.csv