hive的数据导入与数据导出:(本地,云hdfs,hbase),列分隔符的设置,以及hdfs上传给pig如何处理
hive表的数据源有四种:
hbase
hdfs
本地
其他hive表
而hive表本身有两种:
内部表和外部表。
而hbase的数据在hive中,可以建立对应的外部表(参看hive和hbase整合)
内部表和外部表
区别:删除时,内部表删除hadoop上的数据;而外部表不删,其数据在外部存储,hive表只是查看数据的形式,看时从外部读入数据:
内部表:CREATETABLE tab(column1 STRING, column2 STRING);
外部表:用EXTERNAL 关键字,且必须在表结尾指定如下参数
CREATE EXTERNAL TABLE tab
(column1 STRING,
column2 STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY'\t'
stored as textfile
location 'hdfs://namenode/tmp/lmj/tab/';
分隔符的指定
有两种方式
(1)DELIMITED方式:
ROW FORMAT DELIMITED
[FIELDS TERMINATED BY char]
[COLLECTION ITEMS TERMINATED BY char]
[MAP KEYS TERMINATED BY char]
[LINES TERMINATED BY char]
(2)SERDE方式:
SERDE serde_name [WITH SERDEPROPERTIES(property_name=property_value, property_name=property_value, ...)]
其中,[ROW FORMAT DELIMITED]关键字,是设置建表时加载数据所支持的列分隔符;
如果没有指定 ROW FORMAT 或者 ROW FORMAT DELIMITED,则会自动使用自带的 SerDe。
另外,建表时,用户还要为表指定列,同时也会指定自定义的SerDe,Hive通过SerDe确定表的具体的列数据。
举例如下:
内部表
create table user_info (user_id int, cid string,ckid string, username string)
row format delimited
fields terminated by '\t'
lines terminated by '\n';
外部表
CREATE EXTERNAL TABLE test_1(id INT, name STRING, citySTRING)
SORTED AS TEXTFILE
ROW FORMAT DELIMITED
FIELDS TERMINATED BY'\t’
LOCATION ‘hdfs://http://www.cnblogs.com/..’
文件存储格式
如上,用关键字[STORED AS file_format]设置加载数据的文件类型,默认采用[STORED AS TEXTFILE]。主要格式有
STORED AS
SEQUENCEFILE
| TEXTFILE
|RCFILE
|INPUTFORMATinput_format_classname
OUTPUTFORMAT output_format_classname
其中用STORED AS TEXTFILE 存储纯文本文件。如果数据需要压缩,使用 STORED AS SEQUENCE 。Hive本身支持的文件格式只有:Text File,Sequence File。
数据导入与导出:
一.数据导入:
1.1导入内部表
(1)本地或者hdfs导入:
LOAD DATA[LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLEtablename [PARTITION(partcol1=val1, partcol2=val2 ...)]
区别是看有无关键字local,有local表示从本地路径导入,无local表示从hadoop(hbase或hdfs)导入。
导入的前提是目标表必须存在。如果无表要先建表,再导入:
CREATE TABLE myword(idSTRING, counts INT, dt STRING) row formatdelimitedfields terminated by ‘\t’;
(2)用hive表的select结果导入
INSERT OVERWRITE TABLE T1 SELECT * FROMT2;
其中,INSERT OVERWRITE TABLE表示覆盖,删除原数据;
而INSERT into TABLE
表示增量的插入,不删除原数据。
另外,
删除表:drop table if exists T1;
清空表:truncate table T1;
1.2 导入外部表:
建表时直接指定数据源(不能指定本地文件,必须是hdfs路径):
(1)Hdfs上数据导入hive:
CREATE EXTERNAL TABLE wizad_mdm_dev_lmj_edition_20141120 (
cookie_id STRING,
guid STRING
)
ROWFORMAT DELIMITED
FIELDSTERMINATEDBY ','
LINESTERMINATEDBY '\n'
storedas textfile
LOCATION'/user/wizad/test/lmj/edition_compare/';
其中,也可以用全路径location'hdfs://namenode/user/wizad/test/lmj/edition_compare/';
(2)Hbase上数据导入hive表:
先指定参数
SET mapred.job.queue.name=queue3;
SEThbase.client.scanner.caching=5000;
SEThbase.zookeeper.quorum=datanode06,datanode07,datanode08;
SET zookeeper.znode.parent=/hbase;
有map类型结构,建表时需要指明:
CREATE EXTERNAL TABLE lxw2 (
key string,
value map<STRING,STRING>
)
STORED BY'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES("hbase.columns.mapping" =":key,fixeddim:")
TBLPROPERTIES("hbase.table.name"="wizad_mdm_task_geely_hk_20141014");
查询结果
SELECT KEY,dim_name,dim_value FROM lxw2
LATERAL VIEW explode(VALUE) myTable1AS dim_name,dim_value
--WHERE KEY = '000000054153796
这里,读取Hbase库的数据,可能会导入失败,因为scan时间过大,可以设置长时间
sethbase.regionserver.lease.period=180000;
hbase与本地表jion时,可能出现启动后,无限等待。原因:
二.数据导出:
三种导出:
(1)导出到其他hive表:
覆盖:INSERT OVERWRITE TABLE t1 select * from t2;
不覆盖:INSERT INTO TABLE t1 select * from t2;
注意hive不支持 子查询结果直接建表,如 create table t1 as select * from t2; 在hive中是错误的
(2)导出到本地,hdfs(有无local):
INSERT OVERWRITE [LOCAL]DIRECTORY directory1 select_statement1
这里注意:
导出本地时可以指定列分隔符,
而导出到hdfs上不可以使用hive默认\001(^A)
导入到hdfs上不能指定列的分隔符:
使用语句ROW FORMAT DELIMITEDFIELDS TERMINATED BY ',' 会报错,不能识别。
代码如
INSERT OVERWRITE DIRECTORY'/user/wizad/tmp/mytest'
select * from wizad_mdm_dev_lmj_edition_insterest
因为hive导出到hdfs上,默认使用^A作为列分隔符,其对应着001。官方文档:Data
written to the filesystem is serialized as text with columns separated by ^A。(所以,python中用line.split('\x01')或者line.split('\001')切分。)
但这样的数据在pig中无法读入,用'\001'或者'\\001'或者'^A'都无法读入。
解决办法:作为一个列整体读入后,在用STRSPLIT分隔按'\\001'(使用'^A'无效),可以返回一个元组类似((a,b)),pig代码如下
%default interestFlie/user/wizad/tmp/mytest/*
--无效interest_data =LOAD '$interestFlie' USING PigStorage('\\001')
--无效interest_data =LOAD '$interestFlie' USING PigStorage('^A')
interest_data = LOAD '$interestFlie'
AS(cookie_id:chararray
-- guid:chararray,
-- dimkey :chararray,
-- dimvalue:chararray
);
test2 = foreach interest_data generateSTRSPLIT(cookie_id,'\\001');
DUMP res;
describe res;
结果:result结构:{(null)}
((B2BEF56E09EC115456E221,352751019523267,interest_11,161))
((B2BEF56E09EC115456E221,352751019523267,interest_13,102))
((EC15860E09D5EA545700E9,352751019523267,interest_11,161))
((EC15860E09D5EA545700E9,352751019523267,interest_13,102))
((daca0487-5424ef1a0dc3fa-11535481,352751019523267,interest_4,61))
((daca0487-5424ef1a0dc3fa-11535481,352751019523267,interest_21,21))
((daca0487-5424ef1a0dc3fa-11535481,352751019523267,interest_11,161))
((daca0487-5424ef1a0dc3fa-11535481,352751019523267,interest_13,102))
指定导出全路径也不行。
INSERT OVERWRITE DIRECTORY'hdfs://namenode/user/wizad/tmp/interest2/'
ROW FORMAT DELIMITED FIELDS TERMINATED BY','
select * fromwizad_mdm_dev_lmj_edition_insterest
2导出到本地,可以指定列分隔符:
INSERT OVERWRITE local DIRECTORY'/home/wizad/lmj/inserest2'
ROW FORMAT DELIMITED FIELDS TERMINATED BY','
select * fromwizad_mdm_dev_lmj_edition_insterest
导入到本地可直接用-e命令,默认使用\t分隔:
hive -e 'use wizad;
select * fromwizad_mdm_dev_lmj_edition_insterest;'>> mytest
查询结果使用\t作为列分隔符,mytest中
3531 3631 3730 3631 3931 3635 34360969 51617061916546.i
vim中16进制(%!xxd)两位对应一个字符,看到"."对应的09,在asii码表中09,就是tab制表符
也可以用hive -f:
[wyp@master ~/local]$ cat wyp.sql
select * from wyp
[wyp@master ~/local]$ hive -f wyp.sql>> local/wyp2.txt
hive的数据导入与数据导出:(本地,云hdfs,hbase),列分隔符的设置,以及hdfs上传给pig如何处理的更多相关文章
- C#变成数据导入Excel和导出Excel
excel 基础 •整个excel 表格叫工作表:workbook:工作表包含的叫页:sheet:行:row:单元格:cell. •excel 中的电话号码问题,看起来像数字的字符串以半角单引号开头就 ...
- 读取本地文件理解FileReader对象的方法和事件以及上传按钮的美化。
一.FileReader对象 用来把文件读入内存,并且读取文件中的数据.FileReader对象提供了异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据. 浏览器支持情况, ...
- 利用cropper插件裁剪本地图片,然后将裁剪过后的base64图片上传至七牛云空间
现在做的项目需要做一些图片处理,由于时间赶急,之前我便没有处理图片,直接将图片放在input[type=file]里面,以文件的形式提交给后台,这样做简直就是最低级的做法,之后各种问题便出来了,人物头 ...
- devexpress 数据导入(gridcontrol 导出 csv)
// 1.gridcontrol 导出 csv: DataTable dtbNew = new DataTable(); dtbNew.Columns.Add().GetType()); dtbNew ...
- Android设置拍照或者上传本地图片
效果例如以下: 看代码: MainActivity类中: package com.example.ceshidemo; import java.io.ByteArrayOutputStream; im ...
- Hive数据导入/导出
1.1 导入/导出规则 EXPORT 命令导出数据表或分区,与元数据一起输出到指定位置.又可以从这个输出位置移动到不同的Hadoop 或Hive 实例中,并且使用IMPORT 命令导入. 当导出一个分 ...
- Oracle导出表数据与导入表数据dmp,以及导入导出时候常见错误
使用DOS 操作界面导出表数据,导入表数据(需要在数据库所在的服务器上边执行) exp UserName/Password@192.168.0.141/orcl file=d:\xtables.d ...
- Elasticsearchdump 数据导入/导出
一.安装过程 Elasticsearchdump 仓库地址,详细使用情况 当前工具主要是用来对ES中的数据进行数据导入/导出,以及对数据迁移相关,使用elasticdump工具需要使用到npm,所以需 ...
- 关于 Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用法
在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: 1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中2. 建立数据库间的 ...
随机推荐
- SpringMVC中url-pattern /和/*的区别
http://blog.csdn.net/u010648555/article/details/51612030
- vue拦截器实现统一token,并兼容IE9验证
项目中使用vue搭建前端页面,并通过axios请求后台api接口,完成数据交互.如果验证口令token写在在每次的接口中,也是个不小的体力活,而且也不灵活.这里分享使用vue自带拦截器,给每次请求的头 ...
- Jenkins持续集成环境, 如何自定义 maven 仓库
最后的解决方法: job-->configure-->Build-->Goals and options: clean package -Dmaven.repo.local=D:\d ...
- Java实现23种设计模式
一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...
- Linux平台安装MongoDB
MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包. 下载地址:https://www.mongodb.com/download-center#community ...
- MultiTigger 绑定异常处理
异常产生环境: 在初始化一个窗口后,没有show出来.在此窗口中,有个控件,重写了控件模板,并加了MultiTrigger. 注意:俩个Condition,一个是从外面绑定过来的Tag,一个是Cont ...
- 搭建一个交互式的前端构建环境.md
为了提高开发效率.减少重复的操作,现在几乎全部的前端项目都需要依赖一些构建工具来实现自动化打包,主流的有webpack, gulp, grunt等.加上各种各样的配置文件就会形成了一个相对复杂的构建环 ...
- java绘图原理------在窗口界面(或面板上)画出一张或多张图片问题解决方法
/** *@author blovedr * 功能: java绘图原理------在窗口界面(或面板上)画出一张或多张图片问题解决方法 * 日期: 2018年4月28日 16:20 * 注释: ...
- 05_CRUD操作
1.Params拦截器: 作用:Parameters拦截器将把表单字段映射到ValueStack栈的栈顶对象的各个属性中, 注意:如果某个字段在栈顶对象中没有对应的属性,则Params拦截器将尝试 ...
- 学习笔记:Zookeeper选举机制
1.Zookeeper选举机制 Zookeeper虽然在配置文件中并没有指定master和slave 但是,zookeeper工作时,是有一个节点为leader,其他则为follower Leader ...