我正在尝试将文本文件加载到hive db中,文本文件中的值被,
分隔,并且在这些值中,一个值是数组类型。
这是我的示例数据。
101,suresh,67,45,67,21,hyderabad
此处:
101
:学生卷号
suresh
:学生姓名
67,45,67,21
:学生成绩
hyderabad
:学生所在地
在这里,我需要如何加载到蜂巢中
101,suresh,[67,45,67,21],hyderabad
其中标记字段必须作为数组类型加载。
我该怎么办?
答案 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