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如何处理的更多相关文章

  1. C#变成数据导入Excel和导出Excel

    excel 基础 •整个excel 表格叫工作表:workbook:工作表包含的叫页:sheet:行:row:单元格:cell. •excel 中的电话号码问题,看起来像数字的字符串以半角单引号开头就 ...

  2. 读取本地文件理解FileReader对象的方法和事件以及上传按钮的美化。

    一.FileReader对象 用来把文件读入内存,并且读取文件中的数据.FileReader对象提供了异步API,使用该API可以在浏览器主线程中异步访问文件系统,读取文件中的数据. 浏览器支持情况, ...

  3. 利用cropper插件裁剪本地图片,然后将裁剪过后的base64图片上传至七牛云空间

    现在做的项目需要做一些图片处理,由于时间赶急,之前我便没有处理图片,直接将图片放在input[type=file]里面,以文件的形式提交给后台,这样做简直就是最低级的做法,之后各种问题便出来了,人物头 ...

  4. devexpress 数据导入(gridcontrol 导出 csv)

    // 1.gridcontrol 导出 csv: DataTable dtbNew = new DataTable(); dtbNew.Columns.Add().GetType()); dtbNew ...

  5. Android设置拍照或者上传本地图片

    效果例如以下: 看代码: MainActivity类中: package com.example.ceshidemo; import java.io.ByteArrayOutputStream; im ...

  6. Hive数据导入/导出

    1.1 导入/导出规则 EXPORT 命令导出数据表或分区,与元数据一起输出到指定位置.又可以从这个输出位置移动到不同的Hadoop 或Hive 实例中,并且使用IMPORT 命令导入. 当导出一个分 ...

  7. Oracle导出表数据与导入表数据dmp,以及导入导出时候常见错误

    使用DOS 操作界面导出表数据,导入表数据(需要在数据库所在的服务器上边执行) exp UserName/Password@192.168.0.141/orcl   file=d:\xtables.d ...

  8. Elasticsearchdump 数据导入/导出

    一.安装过程 Elasticsearchdump 仓库地址,详细使用情况 当前工具主要是用来对ES中的数据进行数据导入/导出,以及对数据迁移相关,使用elasticdump工具需要使用到npm,所以需 ...

  9. 关于 Oracle 的数据导入导出及 Sql Loader (sqlldr) 的用法

    在 Oracle 数据库中,我们通常在不同数据库的表间记录进行复制或迁移时会用以下几种方法: 1. A 表的记录导出为一条条分号隔开的 insert 语句,然后执行插入到 B 表中2. 建立数据库间的 ...

随机推荐

  1. 读书笔记-《Maven实战》-关于Maven依赖传递的思考 2018/4/26

    上次读书笔记中,提到了依赖传递.看着依赖传递表,一直在思考为什么会是这样. 先看传递表: compile test provided runtime compile test provided run ...

  2. spring cloud 入门系列二:使用Eureka 进行服务治理

    服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现. Spring Cloud Eureka是Spring Cloud Netflix 微服务套件的一部分 ...

  3. LINUX逻辑卷(LVM)管理与逻辑卷分区

    LINUX之逻辑卷管理与逻辑卷扩展 LVM是逻辑卷管理(Logical Volume Manager)的简称,他是建立在物理存储设备之上的一个抽象层,允许你生成逻辑存储卷,和直接使用物理存储在管理上相 ...

  4. Python3 基础语法

    编码 默认情况下,Python 3源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*- 标 ...

  5. IT男的别样人生,爱折腾,竟然辞职跑丽江去了

    深圳待了4年,在深圳腾讯总部任职,北漂了5年多,任某知名团购公司CTO,有了孩子以后才知道自己想要什么 2015年4月,我和老婆还有6个月的儿子丽江游, 却在旅行的第四天, 买下了位于束河古镇正门的高 ...

  6. hive中的NULL(hive空值处理)

    HIVE表中默认将NULL存为\N,可查看表的源文件(hadoop fs -cat或者hadoop fs -text),文件中存储大量\N, 这样造成浪费大量空间.而且用java.python直接进入 ...

  7. 算法之路(三)----查找斐波纳契数列中第 N 个数

    算法题目 查找斐波纳契数列中第 N 个数. 所谓的斐波纳契数列是指: * 前2个数是 0 和 1 . * 第 i 个数是第 i-1 个数和第i-2 个数的和. 斐波纳契数列的前10个数字是: 0, 1 ...

  8. 【mybatis深度历险系列】延迟加载

    在前面的博文中,小编主要简单的介绍了mybatis中的高级映射,小伙伴们可以把mybatis和hibernate的因素进行对比,更加有利于理解.今天这篇博文,小编主要来简单介绍一下mybatis中的延 ...

  9. Freeline--Android平台上的秒级编译方案

    Freeline 技术揭秘 Freeline是什么? Freeline是蚂蚁金服旗下一站式理财平台蚂蚁聚宝团队15年10月在Android平台上的量身定做的一个基于动态替换的编译方案,5月阿里集团内部 ...

  10. Python实现八大排序算法(转载)+ 桶排序(原创)

    插入排序 核心思想 代码实现 希尔排序 核心思想 代码实现 冒泡排序 核心思想 代码实现 快速排序 核心思想 代码实现 直接选择排序 核心思想 代码实现 堆排序 核心思想 代码实现 归并排序 核心思想 ...