将字段加载并映射到 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 |
+------------------+---------------------+--+
我是 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 |
+------------------+---------------------+--+