使用Hive复杂数据类型

时间:2018-08-14 03:28:58

标签: sql arrays hadoop hive custom-data-type

我正在尝试将文本文件加载到hive db中,文本文件中的值被,分隔,并且在这些值中,一个值是数组类型。

这是我的示例数据。

101,suresh,67,45,67,21,hyderabad

此处:

101:学生卷号

suresh:学生姓名

67,45,67,21:学生成绩

hyderabad:学生所在地

在这里,我需要如何加载到蜂巢中

101,suresh,[67,45,67,21],hyderabad

其中标记字段必须作为数组类型加载。

我该怎么办?

1 个答案:

答案 0 :(得分:1)

您可以使用 regex serde 并创建文本表。

问题出在数组类型,因为正则表达式SERDE 不允许数组数据类型。

hive> CREATE TABLE details(
  id STRING,
  name STRING,
  marks STRING,
  location STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES  (
"input.regex" = "^(.*?),(.*?),(.*),(.*)"
)
STORED AS TEXTFILE;

hive> select * from details;
+------+---------+--------------+------------+--+
|  id  |  name   |    marks     |  location  |
+------+---------+--------------+------------+--+
| 101  | suresh  | 67,45,67,21  | hyderabad  |
+------+---------+--------------+------------+--+

要解决此问题,您可以创建另一个具有array<string> 数据类型的表,然后将其插入final_table中,从 regex serde表中进行选择。

hive> select id,name,array(marks)marks,location from access_log;
+------+---------+------------------+------------+--+
|  id  |  name   |      marks       |  location  |
+------+---------+------------------+------------+--+
| 101  | suresh  | ["67,45,67,21"]  | hyderabad  |
+------+---------+------------------+------------+--+

(或)

代替创建正则表达式Serde表,只需使用逗号分隔符创建文本表

hive> CREATE TABLE details(
      id STRING,
      name STRING,
      marks1 STRING,
      marks2 STRING,
      marks3 STRING,
      marks4 STRING,
      location STRING
    )
    ROW FORMAT delimited Fields Terminated by ','
    STORED AS TEXTFILE;

然后创建具有数组数据类型的最终表,并将其插入 final_Table 中,从文本表中进行选择。

hive> select id,name,array(marks1,marks2,marks3,marks4) marks,location from details