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。

导出到本地:

INSERT OVERWRITE local DIRECTORY '/home/rengang1/jypt/res.csv'

ROW FORMAT DELIMITED FIELDS TERMINATED BY','

select * from dev.dev_jiadian_user_yuge;

---------------------------------------------------------------------

数据导入与导出:
一.数据导入:
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

  

参考:https://blog.csdn.net/longshenlmj/article/details/41519503

Hive 指定分隔符,将表导出到本地的更多相关文章

  1. sql 同步远程数据库(表)到本地

    一)在同一个数据库服务器上面进行数据表间的数据导入导出: 1. 如果表tb1和tb2的结构是完全一样的,则使用以下的命令就可以将表tb1中的数据导入到表tb2中: insert into db2.tb ...

  2. [Hive_3] Hive 建表指定分隔符

    0. 说明 Hive 建表示例及指定分隔符 1. Hive 建表 Demo 在 Hive 中输入以下命令创建表 user2 create table users2 (id int, name stri ...

  3. HIVE中的数据怎么导出到hdfs或本地呢

    思路一:重定向 在我不知道工具 ,也不熟悉HIQL语法的情况下,没办法了,只有选择一个最简单粗暴的方法,重定向. 在shell中使用 hive -e 可以在shell中执行hive命令,hive -f ...

  4. [Sqoop]将Hive数据表导出到Mysql

    业务背景 mysql表YHD_CATEG_PRIOR的结构例如以下: -- Table "YHD_CATEG_PRIOR" DDL CREATE TABLE `YHD_CATEG_ ...

  5. hive 创建/删除/截断 表(翻译自Hive wiki)

    这里罗列常用操作,更多参考 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL- ...

  6. Hive的两种表

    1.内部表 内部表Load数据有两种方式:① Load data ***:②hdfs dfs -put ****.这是因为在Metastore文件,即mysql的hive数据库的“SDS”表中,保存着 ...

  7. Hive的数据库和表

    本文介绍一下Hive中的数据库(Database/Schema)和表(Table)的基础知识,由于篇幅原因,这里只是一些常用的.基础的. Hive的数据库和表 先看一张草图: Hive结构 从图上可以 ...

  8. Hive 文件格式 & Hive操作(外部表、内部表、区、桶、视图、索引、join用法、内置操作符与函数、复合类型、用户自定义函数UDF、查询优化和权限控制)

    本博文的主要内容如下: Hive文件存储格式 Hive 操作之表操作:创建外.内部表 Hive操作之表操作:表查询 Hive操作之表操作:数据加载 Hive操作之表操作:插入单表.插入多表 Hive语 ...

  9. Hive 特殊分隔符处理

    HIVE特殊分隔符处理 Hive对文件中的分隔符默认情况下只支持单字节分隔符,,默认单字符是\001.当然你也可以在创建表格时指定数据的分割符号.但是如果数据文件中的分隔符是多字符的,如下图: 01| ...

随机推荐

  1. Cocos2d-x 水果忍者划痕效果

    网上找的一个关于水果忍者划痕的,效果还算凑合.其原理就是基于OpenGL绘制直线,因为版本号过老,此处笔者改动了一些方法,粘贴后可直接使用 适用于Cocos2d-x 2.2.1 .h文件里须要添�的代 ...

  2. 为什么Scrum不行?

    这篇文章的原文在这里(原文链接)(下文不是全译,也不是部分译,我只是把其总结,有我自己的发挥,但是原意大致不变),这篇文章完全是在调侃Scrum的,作者第一段就是一个免费声明,其说他是Scrum和其它 ...

  3. linux中grep命令的使用

    转载:http://blog.csdn.net/universsky/article/details/8866402 linux中grep命令的使用 grep (global search regul ...

  4. Matlab 2018b 新特性

    新特性简要介绍 一.实时编辑器 所创建的脚本不仅可以捕获代码,还可以讲述与人分享的故事.自动化的上下文提示可让您在编程时快速推进,并且将结果与可视化内容和您的代码一起显示. 二.App Designe ...

  5. DELPHI纤程的演示

    DELPHI纤程的演示 DELPHI7编译运行通过. 纤程实现单元: unit FiberFun; //Fiber(纤程测试Demo)//2018/04/11//QQ: 287413288 //参考 ...

  6. 什么是进程And线程

    原创 2015年02月01日 11:49:01   学习.net 时遇到了两个新词汇:进程和线程.书上的太深奥,就查了查资料,整合下,希望对大家有帮助. [比喻]:用手去抓苹果,很显然一根手指是不行, ...

  7. easyui select 下拉框的取值和赋值

    1.取值 //拍卖管理中示例 function serializeForm(form) { var obj = { auclotType : $('#auclotType').val(), goods ...

  8. @Redis Desktop Manager无法连接虚拟机中启动的redis服务问题解决

    Redis Desktop Manager下载地址 https://redisdesktop.com/download 安装好以后连接linux服务器上的Redis服务器错误: 问题排查: 1.检查R ...

  9. .NET 代码注入 CodeInject

    CInject (or CodeInject) 允许直接往托管的代码中注入代码,而无需反编译.可在单个或者多个方法中注入你要执行的代码.使用 CInject 时你无需了解目标应用的细节,你通过注入来轻 ...

  10. C++游戏系列:文件夹

    C++游戏系列1:角色类 C++游戏系列2:给角色装备武器 C++游戏系列3:用多文件组织角色类 C++游戏系列4:杀伤距离有限制 C++游戏系列5:不止有一件武器 C++游戏系列6:自己动起来 C+ ...