加载结构或配置单元中的任何其他复杂数据类型

weylhg0b  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(423)

我有一个 .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
我错过了什么 CREATE TABLE.. ?

igsr9ssn

igsr9ssn1#

也可以在中为结构类型添加分隔符 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;
bz4sfanl

bz4sfanl2#

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

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

在配置单元表中加载此数据:

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

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

e5nqia27

e5nqia273#

在使用复杂类型(如struct)时,建议对集合使用唯一的分隔符,而不是用于字段(列)的分隔符。考虑使用“,”逗号分隔符的以下格式的csv文件。输入.csv
代码,区域名称,num,total,perc,num,total,perc,num,total,perc 1100,阿尔伯里,90444,17.4,73546,13.4,86546,15.8
1111,武装,40404,14.4,97701,13.8,76701,10.8
预期结果是在字段(num、total和perc)之外创建一个复杂类型:
1100,阿尔伯里,结构<90444,17.4>,结构<73546,13.4>,结构<86546,15.8>
1111,武装,结构<40404,14.4>,结构<97701,13.8>,结构<76701,10.8>
在本例中,当我们尝试使用以下配置单元查询从字段(num、total和perc)中创建一个复杂类型时,我们将在表中获得多个空值,因为字段和集合都使用相同的“,”逗号分隔符,所以配置单元查询未能按需分隔数据。

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阿尔伯里{“num”:90.0,“total”:null,“perc”:null}{“num”:444.0,“total”:nul,“perc”:null}{“num”:17.4,“total”:null,“perc”:null}
1111 armid{“num”:40.0,“total”:null,“perc”:null}{“num”:404.0,“total”:nul,“perc”:null}{“num”:14.4,“total”:null,“perc”:null}
所用时间:0.15秒,获取时间:2行
我怀疑你正面临这个问题。
struct的用法现在考虑具有以下格式数据的输入文件,其中“,”逗号分隔符用于字段和集合项“#”用作分隔符。
1100,阿尔伯里,90#444#17.4,73ා546ා13.4,86ා546ා15.8
1111,武装,40#404#14.4,97#701#13.8,76#701#10.8
在本例中,我们可以通过将#指定为集合项的分隔符和字段的分隔符来成功创建复杂类型的表。请检查下面的配置单元查询。

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阿尔伯里{“num”:90.0,“total”:444.0,“perc”:17.4}{“num”:73.0,“total”:546。0,“perc”:13.4}{“num”:86.0,“total”:546.0,“perc”:15.8}
1111 armid{“num”:40.0,“total”:404.0,“perc”:14.4}{“num”:97.0,“total”:701。0,“perc”:13.8}{“num”:76.0,“total”:701.0,“perc”:10.8}
所用时间:0.146秒,获取时间:2行
对于其他复杂类型也应该采取类似的方法,请参阅下面的链接以获取更多信息。
reference:httphttp://edu-kinect.com/blog/2014/06/16/hive-complex-data-types-with-examples/

相关问题