将字段加载并映射到配置单元表中



我是apacheHive的新手。我在HDFS中有两个文件,一个文件包含业务数据,另一个文件类似于映射表。

例如:

文件1类似于:

id;value
1;val1
2;val2
3;val3

文件2是这样的:

value;mappedValue
val1;newValue1
val2;newValue2
val3;newValue3

我想创建一个配置单元表,其中包含具有映射值的数据。

我想要的结果是这样的。

id;value    
1;newValue1
2;newValue2
3;newValue3

最好的方法是什么?

有很多方法可以做到这一点。

一种方法如下:

首先:从直线(HIVE命令行(在HIVE中创建数据库和表。

$ beeline -u jdbc:hive2://localhost:10000
CREATE DATABASE IF NOT EXISTS db_business;
SHOW databases;
USE db_business;
CREATE TABLE IF NOT EXISTS business_data (
id INT, 
value STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ';'
STORED AS TEXTFILE
TBLPROPERTIES("skip.header.line.count"="1");
CREATE TABLE IF NOT EXISTS mapping_table (
value STRING, 
mapped_value STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ';'
STORED AS TEXTFILE
TBLPROPERTIES("skip.header.line.count"="1");
SHOW tables;

第二:我们必须将数据加载到表中。LOAD DATA INPATH将从原点删除该文件。

LOAD DATA INPATH '/home/user/mydir/business_data.csv' INTO TABLE business_data;
LOAD DATA INPATH '/home/user/mydir/mapping_table.csv' INTO TABLE mapping_table;

您可以使用hdfs dfs命令将数据加载到配置单元表中,而无需从原始中删除数据

$ hdfs dfs -cp /home/user/origin/file.csv /user/hive/warehouse/db_business.db/business_data
$ hdfs dfs -cp /home/user/origin/file1.csv /user/hive/warehouse/db_business.db/mapping_table

第三:我们可以用CTAS(Create table as select)创建第三个表,并连接两个表。

CREATE TABLE master_table
ROW FORMAT DELIMITED FIELDS TERMINATED BY ';'
STORED AS TEXTFILE AS
SELECT id, mapped_value AS value
FROM business_data AS b
JOIN mapping_table AS m ON(b.value = m.value);
SELECT * FROM master_table;
+------------------+---------------------+--+
| master_table.id  | master_table.value  |
+------------------+---------------------+--+
| 1                | newValue1           |
| 2                | newValue2           |
| 3                | newValue3           |
+------------------+---------------------+--+

最新更新