如何将key = value格式文件上传到Hive表?

时间:2014-09-09 05:19:04

标签: hive hql ddl

我是数据工程的新手,所以这可能是一个基本问题,感谢您的帮助。

我有一个文件格式如下 -

first_name=A1 last_name=B1 city=Austin state=TX Zip=78703
first_name=A2 last_name=B2 city=Seattle state=WA

注意:第二行没有可用的邮政编码。

我需要将其上传到Hive,格式如下:

First_name  Last_name   City       State    Zip
A1          B1          Austin     TX       78703
A2          B2          Seattle    WA       NULL

感谢您的帮助!!

2 个答案:

答案 0 :(得分:1)

我想在Hive中做到这一点。我们的想法是首先将整个数据上传到n * 1表(n是行数),然后使用str_to_map函数在第二步中解析键名。

步骤1:将所有数据上传到1列表中。输入一个您确定不会解析数据的分隔符,并且不存在(在这种情况下为\ 002)

DROP TABLE IF EXISTS kv_001;
 CREATE EXTERNAL TABLE kv_001 (
 col_import string
 )
 ROW FORMAT DELIMITED FIELDS TERMINATED BY '\002'
 LOCATION 's3://location/directory/';

步骤2:使用str_to_map函数,提取所需的密钥

DROP TABLE IF EXISTS required_table;
 CREATE TABLE required_table
 (first_name STRING
, last_name STRING
, city STRING
, state STRING
, zip INT);
 INSERT OVERWRITE TABLE required_table
 SELECT 
 params["first_name"] AS first_name
, params["last_name"] AS last_name
, params["city"] AS city
, params["state"] AS state
, params["zip"] AS zip
 FROM
 (SELECT str_to_map(col_import, '\001', '=') params FROM kv_001) A;

答案 1 :(得分:0)

您可以使用python3脚本转换文件,然后将其上传到hive表

尝试以下步骤:

脚本例如:

import sys 

for line in sys.stdin:
    line = line.split()
    res = []
    for item in line:
        res.append(item.split("=")[1])
        if len(line) == 4:
            res.append("NULL")
        print(",".join(res))

如果 zip 字段只能为空,则可以。 要应用它,请使用类似

的内容
cat file | python3 script.py > output.csv

然后使用

将此文件上传到 hdfs
hadoop fs -copyFromLocal ./output.csv hdfs:///tmp/

使用

配置单元中创建表格
CREATE TABLE my_table
(first_name STRING, last_name STRING, city STRING, state STRING, zip STRING) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' STORED AS TEXTFILE;
LOAD DATA INPATH '/tmp/output.csv' 
OVERWRITE INTO TABLE my_table;