我是数据工程的新手,所以这可能是一个基本问题,感谢您的帮助。
我有一个文件格式如下 -
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
感谢您的帮助!!
答案 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
然后使用
将此文件上传到 hdfshadoop 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;