创建hive表和使用Load data指令导入数据的注意事项
(一)创建hive数据库和表
1.1 类似于MySql创建命令,创建数据库和表,并指定它在hdfs上的存储数据的目录'/hive_hdfs_local_data‘
hive> CREATE DATABASE yyz_workdb;
hive> create external table test_user(
> user_id int comment 'userID',
> user_name string comment 'userName'
> )
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/hive_hdfs_local_data';
1.1.1 默认记录和字段分隔符:
\n 每行一条记录
^A 分隔列(八进制 \001)
^B 分隔ARRAY或者STRUCT中的元素,或者MAP中多个键值对之间分隔(八进制 \002)
^C 分隔MAP中键值对的“键”和“值”(八进制 \003)
1.1.2 自定义分隔符:
CREATE TABLE test(
……
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
LINES TERMINATED BY '\n'
1.1.3 查看信息:
hive> DESCRIBE DATABASE yyz_workdb;
OK
yyz_workdb hdfs://localhost:9002/user/hive/warehouse/yyz_workdb.db a6 USER
Time taken: 0.037 seconds, Fetched: 1 row(s)
hive> DESCRIBE DATABASE EXTENDED yyz_workdb;
OK
yyz_workdb hdfs://localhost:9002/user/hive/warehouse/yyz_workdb.db a6 USER
Time taken: 0.032 seconds, Fetched: 1 row(s)
hive> desc test_user;
OK
user_id int userID
user_name string userName
Time taken: 0.069 seconds, Fetched: 2 row(s)
1.1.4 分区表:
CREATE TABLE test(
……
)
PARTITIONED BY ( country STRING ); #分区键和字段不能重复
(二)加载数据,将本地或者hdfs上数据导入hive表
LOAD DATA LOCAL INPATH '/path/to/local/files'
OVERWRITE INTO TABLE test
PARTITION (country='CHINA')
有LOCAL表示从本地文件系统加载(文件会被拷贝到HDFS中)
无LOCAL表示从HDFS中加载数据(注意:文件直接被移动!!!而不是拷贝!!! 并且。。文件名都不带改的。。)
OVERWRITE 表示是否覆盖表中数据(或指定分区的数据)(没有OVERWRITE 会直接APPEND,而不会滤重!)
此外,如果加载同样文件名的文件,会被自动重命名:
(三)测试命令如下:加载数据,将本地或者hdfs上数据导入hive表
create external table test_user(
user_id int comment 'userID',
user_name string comment 'userName'
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION '/hive_hdfs_local_data';
localhost:hdfs_local_data a6$ more user_info.txt
2014001 小王1
2014002 小李2
2014003 小明3
2014004 阿狗4
2014005 姚明5
2.2 创建写入追加文件,内容如下:
localhost:result_data a6$ more user_info_overwrite.txt
2014006 小王6
2014007 小李7
3.本地导入数据:
向刚刚创建的空表中导入数据,
hive> LOAD DATA LOCAL INPATH '/Users/a6/Applications/apache-hive-2.3.0-bin/result_data/user_info.txt' INTO TABLE test_user;
hive> select * from test_user;
OK
2014001 小王1
2014002 小李2
2014003 小明3
2014004 阿狗4
2014005 姚明5
Time taken: 0.161 seconds, Fetched: 5 row(s)
3.1.2 查看这个hive表指定的hdfs存储目录
localhost:result_data a6$ hadoop dfs -ls /hive_hdfs_local_data
Found 1 items
-rwxr-xr-x 1 a6 supergroup 80 2017-11-04 11:06 /hive_hdfs_local_data/user_info.txt
localhost:result_data a6$ hadoop dfs -cat /hive_hdfs_local_data/user_info.txt
2014001 小王1
2014002 小李2
2014003 小明3
2014004 阿狗4
2014005 姚明5
3.2 为测试不使用overwrite的导入数据时追加模式,并且自动重命名,所以进行再次导入,命令如下:
hive> LOAD DATA LOCAL INPATH '/Users/a6/Applications/apache-hive-2.3.0-bin/result_data/user_info.txt' INTO TABLE test_user;
Loading data to table yyz_workdb.test_user
OK
Time taken: 0.811 seconds
3.2.1 查看hive表数据
hive> select * from test_user;
OK
2014001 小王1
2014002 小李2
2014003 小明3
2014004 阿狗4
2014005 姚明5
2014001 小王1
2014002 小李2
2014003 小明3
2014004 阿狗4
2014005 姚明5
Time taken: 0.184 seconds, Fetched: 10 row(s)
3.2.2 查看hive表存储hdfs目录的变化:
localhost:result_data a6$ hadoop dfs -ls /hive_hdfs_local_data
Found 2 items
-rwxr-xr-x 1 a6 supergroup 80 2017-11-04 11:06 /hive_hdfs_local_data/user_info.txt
-rwxr-xr-x 1 a6 supergroup 80 2017-11-04 11:18 /hive_hdfs_local_data/user_info_copy_1.txt
localhost:result_data a6$ hadoop dfs -cat /hive_hdfs_local_data/user_info_copy_1.txt
2014001 小王1
2014002 小李2
2014003 小明3
2014004 阿狗4
2014005 姚明5
从上面可以发现,如果加载同样文件名的文件,会被自动重命名。
localhost:result_data a6$ more user_info_overwrite.txt
2014006 小王6
2014007 小李7
3.3.2 使用带overwrite的load data命令向hive表加载数据
hive> LOAD DATA LOCAL INPATH '/Users/a6/Applications/apache-hive-2.3.0-bin/result_data/user_info_overwrite.txt' OVERWRITE INTO TABLE test_user;
Loading data to table yyz_workdb.test_user
OK
Time taken: 0.53 seconds
3.3.3 查看hive表结果
hive> select * from test_user;
OK
2014006 小王6
2014007 小李7
Time taken: 0.142 seconds, Fetched: 2 row(s)
发现数据库表中的数据被覆盖啦
localhost:result_data a6$ hadoop dfs -ls /hive_hdfs_local_data
Found 1 items
-rwxr-xr-x 1 a6 supergroup 32 2017-11-04 11:21 /hive_hdfs_local_data/user_info_overwrite.txt
localhost:result_data a6$ hadoop dfs -cat /hive_hdfs_local_data/user_info_overwrite.txt
2014006 小王6
2014007 小李7
发现存储hive表的hdfs目录被覆盖啦,
localhost:result_data a6$ hadoop fs -mkdir /hive_input_data
localhost:result_data a6$ hadoop fs -put user_info.txt /hive_input_data
17/11/04 11:34:12 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
localhost:result_data a6$ hadoop dfs -ls /hive_input_data
Found 1 items
-rw-r--r-- 1 a6 supergroup 80 2017-11-04 11:34 /hive_input_data/user_info.txt
4.2.1 在导入之前首先看一下hive表数据存储目录
localhost:result_data a6$ hadoop dfs -ls /hive_hdfs_local_data
Found 1 items
-rwxr-xr-x 1 a6 supergroup 32 2017-11-04 11:21 /hive_hdfs_local_data/user_info_overwrite.txt
4.2.2 再看一下hive表现有的数据
hive> select * from test_user;
OK
2014006 小王6
2014007 小李7
Time taken: 0.209 seconds, Fetched: 2 row(s)
4.3 使用带overwrite参数的load data命令导入数据
hive> LOAD DATA INPATH '/hive_input_data/user_info.txt' OVERWRITE INTO TABLE test_user;
Loading data to table yyz_workdb.test_user
OK
Time taken: 0.729 seconds
4.3.1 查看结果
hive> select * from test_user;
OK
2014001 小王1
2014002 小李2
2014003 小明3
2014004 阿狗4
2014005 姚明5
Time taken: 0.128 seconds, Fetched: 5 row(s)
4.3.2 查看存储要导入hive表那些数据的hdfs文件
localhost:result_data a6$ hadoop dfs -ls /hive_input_data
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
17/11/04 11:38:06 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
此时,存储/hive_input_data/user_info.txt的hdfs目录中就没有数据啦
localhost:result_data a6$ hadoop dfs -ls /hive_hdfs_local_data
-rwxr-xr-x 1 a6 supergroup 80 2017-11-04 11:34 /hive_hdfs_local_data/user_info.txt
通过以上可以有两个发现,一是发现/hive_input_data/user_info.txt的user_info.txt这个导入数据不见了,因为文件被直接移动啦。二是发现原来hive表数据被覆盖啦,如果想要保留hive表的原始数据文件。
localhost:result_data a6$ hadoop fs -put user_info_overwrite.txt /hive_input_data
17/11/04 11:50:22 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
localhost:result_data a6$ hadoop dfs -ls /hive_input_data
Found 1 items
-rw-r--r-- 1 a6 supergroup 32 2017-11-04 11:50 /hive_input_data/user_info_overwrite.txt
4.4.2 查看hive表现有数据
hive> select * from test_user;
OK
2014001 小王1
2014002 小李2
2014003 小明3
2014004 阿狗4
2014005 姚明5
Time taken: 0.242 seconds, Fetched: 5 row(s)
4.5 使用不带overwrite的load data命令加载hdfs上数据到hive表
hive> LOAD DATA INPATH '/hive_input_data/user_info_overwrite.txt' INTO TABLE test_user;
Loading data to table yyz_workdb.test_user
OK
Time taken: 0.648 seconds
4.5.1 查看导入之后的hive表数据
hive> select * from test_user;
OK
2014001 小王1
2014002 小李2
2014003 小明3
2014004 阿狗4
2014005 姚明5
2014006 小王6
2014007 小李7
Time taken: 0.169 seconds, Fetched: 7 row(s)
hive>
4.5.2 查看被导入的数据文件所在的hdfs目录
localhost:result_data a6$ hadoop dfs -ls /hive_input_data
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
17/11/04 11:51:48 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
localhost:result_data a6$
之后发现导入数据文件所在的hdfs目录又空了,即数据文件被移动啦
localhost:result_data a6$ hadoop dfs -ls /hive_hdfs_local_data
DEPRECATED: Use of this script to execute hdfs command is deprecated.
Instead use the hdfs command for it.
17/11/04 11:53:34 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Found 2 items
-rwxr-xr-x 1 a6 supergroup 80 2017-11-04 11:34 /hive_hdfs_local_data/user_info.txt
-rwxr-xr-x 1 a6 supergroup 32 2017-11-04 11:50 /hive_hdfs_local_data/user_info_overwrite.txt