在创建表之后,表中没有数据,我们不可能insert
存入数据。
而是,通过数据加载,将HDFS
中的数据关联到Hive
表中。
建表
CREATE TABLE myhive.test_load(
dt string comment '时间(时分秒)',
user_id string comment '用户ID',
word string comment '搜索词',
url string comment '用户访问网址'
) comment '搜索引擎日志表'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
SQL语法
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename;
OVERWRITE
:覆盖原表数据。
元数据
00:00:01 1233215666 传智播客 http://www.itcast.cn
00:50:00 2233216666 黑马程序员 http://www.itcast.cn
01:06:00 3233217666 大数据 http://www.itcast.cn
03:36:00 3233218666 hadoop http://www.itcast.cn
19:39:00 2233219666 python http://www.itcast.cn
21:26:00 1233211666 大数据开发 http://www.itcast.cn
23:22:00 6233212666 itheima http://www.itcast.cn
这种方式,是先将本地数据上传
到HDFS
文件系统中,然后,关联到Hive
表中。
这里的本地,是指安装Hive
的服务器。
SQL
LOAD DATA LOCAL INPATH '/home/atguigu/search_log.txt' INTO TABLE myhive.test_load;
这种方式,是将HDFS
文件系统重其他目录的数据,Move
到Hive
表对应的目录中,从而,关联到Hive
表中。
SQL
此时inpath
对应的是HDFS
中文件的路径。
LOAD DATA INPATH '/tmp/search_log.txt' INTO TABLE myhive.test_load;
加载后,源文件就不在了。
这个方式,和MySQL
语法差不多
INSERT [OVERWRITE | INTO] TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)
[IF NOT EXISTS]] select_statement1 FROM from_statement;
将SELECT
查询语句的结果插入到其它表中,被SELECT
查询的表可以是内部表或外部表。
注意:列字段要对齐,否则数据错乱。
示例:
INSERT INTO TABLE tbl1 SELECT * FROM tbl2;
INSERT OVERWRITE TABLE tbl1 SELECT * FROM tbl2;
基本语法:
insert overwrite [local] directory 'path' select_statement1 FROM from_statement;
将查询的结果导出到本地 - 使用默认列分隔符
insert overwrite local directory '/home/hadoop/export1'
select * from test_load ;
将查询的结果导出到本地 - 指定列分隔符
insert overwrite local directory '/home/hadoop/export2'
row format delimited fields terminated by '\t'
select * from test_load;
将查询的结果导出到HDFS
文件系统中(不带local
关键字)
insert overwrite directory '/tmp/export'
row format delimited fields terminated by '\t'
select * from test_load;
基本语法:(hive -f/-e 执行语句或者脚本 > file
)
bin/hive -e "select * from myhive.test_load;" > /home/hadoop/export3/export4.txt
bin/hive -f export.sql > /home/hadoop/export4/export4.txt
注意:shell
中的重定向符号>
只能捕获程序的标准输出
。