创建hive表和使用Load data指令导入数据的注意事项

25 篇文章 1 订阅

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

  • 14
    点赞
  • 64
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
是的,Hive创建外部可以直接导入数据。下面是具体的步骤: 1. 打开Hive命令行终端,输入以下命令以创建一个新的数据库: ``` CREATE DATABASE my_database; ``` 2. 使用以下命令来选择创建数据库: ``` USE my_database; ``` 3. 输入以下命令创建一个新的外部,并直接从数据文件导入数据,例如我们创建一个名为`my_table`的外部: ``` CREATE EXTERNAL TABLE my_table ( id INT, name STRING, age INT ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LOCATION '/user/hive/data' tblproperties ("skip.header.line.count"="1"); LOAD DATA LOCAL INPATH '/path/to/data/file/data.txt' OVERWRITE INTO TABLE my_table; ``` 上述命令创建了一个外部,其结构与前面创建相同,但是它的数据存储在`/user/hive/data`目录下,而不是Hive默认的目录中。在的属性中,我们使用了`"skip.header.line.count"="1"`来跳过数据文件的第一行,这样就不会将数据文件导入中。 4. 在创建外部的同使用`LOAD DATA`命令将数据从本地文件中导入到外部中,例如我们将数据文件存储在`/path/to/data/file/data.txt`目录下。这里使用了`LOCAL INPATH`参数来指明数据文件的本地路径,`OVERWRITE`参数示如果中已经有数据,则覆盖原有数据。 到这里,我们就完成了Hive创建外部并直接导入数据的过程。需要注意的是,外部数据存储在Hadoop集群中,并且Hive只是对这些数据的元数据进行管理,因此在删除外部数据不会被删除。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值