将字段加载并映射到 Hive Table

Loading and mapping a field into Hive Table

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

例如:

文件 1 如下:

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

文件2是这样的:

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

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

我想要的结果是这样的

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

最好的方法是什么?

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

一种方法如下:

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

$ 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;

其次:我们必须将数据加载到 table 中。 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 命令将数据加载到配置单元 table 而无需从源中删除数据

$ 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) 创建第三个 table 并加入两个 table。

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           |
+------------------+---------------------+--+