创建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表

2.1 命令格式如下:
LOAD DATA LOCAL INPATH '/path/to/local/files'
OVERWRITE  INTO TABLE test
PARTITION (country='CHINA')

有LOCAL表示从本地文件系统加载(文件会被拷贝到HDFS中)
无LOCAL表示从HDFS中加载数据(注意:文件直接被移动!!!而不是拷贝!!! 并且。。文件名都不带改的。。)
OVERWRITE  表示是否覆盖表中数据(或指定分区的数据)(没有OVERWRITE  会直接APPEND,而不会滤重!)
此外,如果加载同样文件名的文件,会被自动重命名:

(三)测试命令如下:加载数据,将本地或者hdfs上数据导入hive表

1. 建表:创建表,并指定它在hdfs上的存储数据的目录
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';
2.准备数据:
2.1 在本地创建一个存储数据的文本文件,准备上传,内容如下:
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;
3.1 查看结果
3.1.1 查看hive表数据
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
从上面可以发现,如果加载同样文件名的文件,会被自动重命名。
3.3 测试使用带overwrite加载本地数据的load data命令:
3.3.1 准备写入追加文件,内容如下:
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)
发现数据库表中的数据被覆盖啦
3.3.4 查看存储hive表的hdfs目录的变化
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目录被覆盖啦,
所以不能轻易使用overwrite进行插入数据,因为会覆盖原来已经存储的hive数据呢
4. 下面测试一下将hdfs的文件导入hive数据表。
4.1 准备存储姚导入数据文件的hdfs目录,并上传需要导入hive表的文件
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目录中就没有数据啦
4.3.3 同时也观察下该hive表存储数据目录的变化;
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表的原始数据文件。
所以一般要慎重使用overwrite。
4.4 下面测试不带overwrite参数,将hdfs上的数据
4.4.1 上传本地文件到hdfs目录
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目录又空了,即数据文件被移动啦
4.5.3 下面看一下存储hive表数据的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

Logo

更多推荐