往hive load 分区表表中load数据,为什么hive load 分区表条件也导入进去了

Hive基础(数据库,表,分区表,视图,导入导出数据)
1,Hive的数据单元
Databases:,概念等同于关系型数据库的Schema; Tables:表,概念等同于关系型数据库的表,不多解释; Partitions:分区,概念类似于关系型数据库的表分区,没有那么多分区类型,只支持固定分区,将同一组数据存放至一个固定的分区中。 Buckets (or Clusters):分桶,同一个分区内的数据还可以细分,将相同的KEY再划分至一个桶中,这个有点类似于HASH分区,只不过这里是HASH分桶,也有点类似子分区吧。
2,Hive中的数据库(Database)
进入Hive命令行,执行命令,可以列出hive中的所有数据库,进入Hive-Cli之后,默认进到default数据库下。使用可以切换到某个数据库下,同。
创建数据库。 比如,创建名为lxw1234的数据库:
CREATE DATABASE IF NOT EXISTS lxw1234
COMMENT 'lxw的大数据田地-lxw1234.com'
localtion 'hdfs://namenode/user/lxw1234/lxw1234.db/';
创建时候可以指定数据库在HDFS上的存储位置。
修改数据库属性和所有者 :
ALTER (DATABASE|SCHEMA) database_name
SET DBPROPERTIES (property_name=property_value, &);
ALTER (DATABASE|SCHEMA) database_name
SET OWNER [USER|ROLE] user_or_
删除数据库:
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
默认情况下,RESTRICT关键字就是默认情况,Hive不允许删除一个里面有表存在的数据库,如果想删除数据库,要么先将数据库中的表全部删除,要么可以使用CASCADE关键字,使用该关键字后,Hive会自己将数据库下的表全部删除。
3,Hive中的表(Table)
进入Hive-Cli,使用切换到指定数据库之后,执行 即可查看该数据库下所有的表,可以使用来查看表的结构,用desc命令更详细,其中包括了存储路径。
内部表和外部表
Hive中的表分为内部表(MANAGED_TABLE)和外部表(EXTERNAL_TABLE)。
区别: 内部表DROP时候会删除HDFS上的数据; 外部表DROP时候不会删除HDFS上的数据; 内部表适用场景:适用于Hive中间表、结果表、以及不需要从外部(如本地文件、HDFS)load数据的情况。 外部表适用场景:源表,需要定期将外部数据映射到表中。 适用场景举例说明:每天将收集到的网站日志定期流入HDFS文本文件,一天一个目录,在Hive中建立外部表作为源表,通过添加分区的方式,将每天HDFS上的原始日志映射到外部表的天分区中,在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表。
创建表, 常用代码:
CREATE EXTERNAL TABLE t_lxw1234 (
ip STRING COMMENT '访问者IP',
avg_view_depth DECIMAL(5,1),
bounce_rate DECIMAL(6,5)
) COMMENT 'lxw的大数据田地-lxw1234.com'
PARTITIONED BY (day STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS textfile
LOCATION 'hdfs://cdh5/tmp/lxw1234/';
关键字EXTERNAL:表示该表为外部表,如果不指定EXTERNAL关键字,则表示内部表 。 关键字COMMENT: 为表和列添加注释。 关键字PARTITIONED BY: 表示该表为分区表,分区字段为day,类型为string。表分区下一章单独讲。
关键字ROW FORMAT DELIMITED: 指定表的分隔符,通常后面要与以下关键字连用:
FIELDS TERMINATED BY ',':指定每行中字段分隔符为逗号。 LINES TERMINATED BY '\n':指定行分隔符 。 COLLECTION ITEMS TERMINATED BY ',':指定集合中元素之间的分隔符 。
MAP KEYS TERMINATED BY ':':指定数据中Map类型的Key与Value之间的分隔符,举个例子:
create table score(
name string,
score map& string,int&
) ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':';
对应的要加载的文本数据为:
biansutao '数学':80,'语文':89,'英语':95
jobs '语文':60,'数学':80,'英语':99
关键字STORED AS: 指定表在HDFS上的文件存储格式,可选的文件存储格式有:
TEXTFILE:文本,默认值 。 SEQUENCEFILE: 二进制序列文件 。 RCFILE、ORC、PARQUET: 几种列式存储格式文件。 关键字LOCATION: 指定表在HDFS上的存储位置。
4,Hive中的分区表
Hive中的表分区就是将同一组数据放到同一个HDFS目录下,当查询中过滤条件指定了某一个分区值时候,只将该分区对应的目录作为Input,从而减少MapReduce的输入数据,提高查询效率。
创建分区表
CREATE EXTERNAL TABLE t_lxw1234 (
ip STRING COMMENT '访问者IP',
avg_view_depth DECIMAL(5,1),
bounce_rate DECIMAL(6,5)
) COMMENT 'lxw的大数据田地-lxw1234.com'
PARTITIONED BY (month STRING, day STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
在创建表时候,使用PARTITIONED BY关键字来指定该表为分区表,后面括号中指定了分区的字段和类型,分区字段可以有多个,在HDFS中对应多级目录,比如,上面的表t_lxw1234的分区month=';,day=''对应HDFS上的路径为:
/user/hive/warehouse/default.db/t_lxw1234/month=2015-06/day=/
当查询中指定了month='; AND day='',MapReduce直接从该目录中读取数据,如果只指定了month=';,那么MapReduce将/month=2015-06/下所有的子目录都作为Input。
往分区中追加数据:
INSERT INTO TABLE t_lxw1234
PARTITION (month = ';,day = '')
SELECT * FROM
覆盖分区数据:
INSERT overwrite TABLE t_lxw1234
PARTITION (month = ';,day = '')
SELECT * FROM
使用ALTER TABLE添加分区:
ALTER TABLE t_lxw1234
ADD PARTITION (month = ';,day = '')
location 'hdfs://namenode/tmp/lxw1234/month=2015-06/day=/';
动态分区:
关系型数据库(如)中,对分区表Insert数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive中也提供了类似的机制,即动态分区(Dynamic Partition),只不过,使用Hive的动态分区,需要进行相应的配置,具体可看https://lxw1234.com/archives/.htm
然后语句类似这样:
INSERT overwrite TABLE t_lxw1234_partitioned
PARTITION (month,day)
SELECT url,substr(day,1,7) AS month,day
FROM t_lxw1234;
注意:在PARTITION (month,day)中指定分区字段名即可,同时SELECT子句的最后两个字段,必须对应前面PARTITION (month,day)中指定的分区字段,包括顺序。
查看分区表及对应的HDFS路径
使用命令 show partitions t_lxw1234; 查看对应表的所有分区。如果要查看该分区的详细信息(包括该分区在HDFS上的路径)的话,命令如下:
desc formatted t_lxw1234 partition (month = '; , day = '');
删除分区表
ALTER TABLE t_lxw1234
DROP PARTITION (month = ';, day = '');
注意:也分内部表和外部表,如果该分区表为外部表,则分区对应的HDFS目录数据不会被删除。
5,Hive视图相关
在真实业务场景下,视图的应用比较少,分区使用的非常多,因此建议对分区这块多花的时间来了解。
和关系型数据库一样,Hive中也提供了视图的功能,注意Hive中视图的特性,和关系型数据库中的稍有区别:
只有逻辑视图,没有物化视图; 视图只能查询,不能Load/Insert/Update/Delete数据; 视图在创建时候,只是保存了一份元数据,当查询视图的时候,才开始执行视图对应的那些子查询;
CREATE VIEW IF NOT EXISTS v_lxw1234 (
url COMMENT 'url'
) COMMENT 'view lxw1234'
AS SELECT url FROM lxw1234
WHERE url LIKE 'https://%'
LIMIT 100;
DROP VIEW IF EXISTS v_lxw1234;
ALTER VIEW v_lxw1234
AS SELECT url FROM lxw1234 limit 500;
6,导入导出数据
在Hive中建好表之后,需要将数据加载进来,以便做后续查询分析。
建表时直接指定HDFS路径
如果你的数据已经在HDFS上存在,已经为结构化数据,并且数据所在的HDFS路径不需要维护,那么可以直接在建表的时候使用location指定数据所在的HDFS路径即可。比如:
CREATE [EXTERNAL] TABLE t_lxw1234 (
day STRING,
url STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ' '
stored as textfile
location '/tmp/lxw1234/';
注意:这里内部表和外部表都可以指定,如果是内部表,那么在DROP该表的时候,同时会将LOCATION所指定的目录一起删除。
表已存在,从本地文件或者HDFS加载数据
如果数据在本地,或者HDFS的某一个目录下,需要加载到目标中或分区中,那么使用LOAD DATA命令即可加载数据:
//加载本地文件
LOAD DATA LOCAL INPATH '/home/lxw1234/t_lxw1234/'
INTO TABLE t_lxw1234 PARTITION (day = '');
//加载HDFS文件
LOAD DATA INPATH '/user/lxw1234/t_lxw1234/'
INTO TABLE t_lxw1234 PARTITION (day = '');
表已存在,从一个子查询中加载数据
这个比较简单,就是将一个查询结果插入到目标表或分区中:
//追加数据是把overwrite改成INTO
INSERT overwrite TABLE t_lxw1234
PARTITION (day = '')
SELECT day,url from source_
注意:还支持多表插入,可以在同一个查询中使用多个insert子句,这样的好处是我们只需要扫描一遍源表就可以生成多个输出,具体做法是把from语句放在开头,例如:
from test1
insert into table test2
partition(age)
select id, name, tel, age
insert into table test3
select id, name
where age&25;
用子查询的数据进行建表
create table new_table
as select id, name
注意:如果select查询失败,新表是不会创建的。
导出Hive中的数据到文件系统
INSERT OVERWRITE LOCAL DIRECTORY '/tmp/lxw1234/'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
SELECT * FROM t_lxw1234;
注意:如果指定了LOCAL关键字,则为导出到本地文件系统,否则,导出到HDFS。使用ROW FORMAT关键字可以指定导出的文件分隔符,默认是\001。
原文来自:https://lxw1234.com/archives/.htm关于hive中如何创建外部分区表并且自动指定相应分区?_百度知道
关于hive中如何创建外部分区表并且自动指定相应分区?
问题描述:
项目需求,通过flume从本地抽取数据到hdfs中(这个过程以实现),抽取到hdfs的文件是以当天的时间命名的文件,存放当天更新的数据。比如说,今天是号,所以在hdfs存储的目录(假设为/user/flume/)下会自己生成一个文件为...
我有更好的答案
)]具体可以参考官方文档,了解HIVS SQL DML操作, partcol2=val2 :按照天为目录生成了多个数据文件.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-InsertingdataintoHiveTablesfromqueries" target="_blank">https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-InsertingdataintoHiveTablesfromqueries即需求场景应该是,但想要在HIVE中通过月来建立分区以便进行统计分析直接用hive load data 把天的数据导入月分区,导入时指定分区; [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1,不用提前创建。SyntaxLOAD DATA [LOCAL] INPATH &#39;filepath&#39..:<a href="https://cwiki.apache
可是那样不能做到自动导入啊,我想的是能自动导入数据。当数据量大的时候。比如说我每天都有产生很多文件,我把这些文件都通过flume扫描到了hdfs中,那按照每天生成的文件,我想根据月来进行分区的话,hdfs的文件一有变化我就需要自己手动导入?一天可以,一个月也可以,那一年呢?还要自己每天导入吗?还有一年的数据一次性导入分区,那我还要写导入哪天的分区吗?
采纳率:100%
为您推荐:
其他类似问题
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。导入导出 Oracle 分区表数据_数据库技术_Linux公社-Linux系统门户网站
你好,游客
导入导出 Oracle 分区表数据
来源:Linux社区&
作者:robinson_0612
导入导入 分区表数据是Oracle DBA 经常完成的任务之一。分区表的导入导出同样普通表的导入导出方式,只不过导入导出需要考
虑到分区的特殊性,如分区索引,将分区迁移到普通表,或使用原始分区表导入到新的分区表。下面将描述使用imp/exp,impdp/expdp导入导出
分区表数据。&
一、分区级别的导入导出
&&& 可以导出一个或多个分区,也可以导出所有分区(即整个表)。
&&& 可以导入所有分区(即整个表),一个或多个分区以及子分区。
&&& 对于已经存在数据的表,使用imp导入时需要使用参数IGNORE=y,而使用impdp,加table_exists_action=append | replace 参数。
二、创建演示环境
&&& 1.查看当前数据库的版本
&&&&&&& SQL& select * from v$version where rownum & 2;
&&&&&&& BANNER
&&&&&&& --------------------------------------------------------------------------------
&&&&&&& Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
&&& 2.创建一个分区表
&&&&&&& SQL& alter session set nls_date_format='yyyy-mm-dd';
&&&&&&& SQL& CREATE TABLE tb_pt (
&&&&&&& sal_date&& DATE NOT NULL,
&&&&&&& sal_id NUMBER NOT NULL,
&&&&&&& sal_row&&& NUMBER(12) NOT NULL)
&&&&&&& partition by range(sal_date)
&&&&&&& partition sal_11 values less than(to_date('','YYYY-MM-DD')) ,
&&&&&&& partition sal_12 values less than(to_date('','YYYY-MM-DD')) ,
&&&&&&& partition sal_13 values less than(to_date('','YYYY-MM-DD')) ,
&&&&&&& partition sal_14 values less than(to_date('','YYYY-MM-DD')) ,
&&&&&&& partition sal_15 values less than(to_date('','YYYY-MM-DD')) ,
&&&&&&& partition sal_16 values less than(to_date('','YYYY-MM-DD')) ,
&&&&&&& partition sal_other values less than (maxvalue)
&&&&&&& ) nologging;
&&& 3.创建一个唯一索引
&&&&&&& CREATE UNIQUE INDEX tb_pt_ind1
&&&&&&& ON tb_pt(sal_date) nologging;
&&& 4.为分区表生成数据
&&&&&&& SQL& INSERT INTO tb_pt
&&&&&&& SELECT TRUNC(SYSDATE)+ROWNUM, dbms_random.random, ROWNUM
&&&&&&& FROM dual
&&&&&&& CONNECT BY LEVEL&=5000;
&&&&&&& SQL& commit;
&&&&&&& SQL& select count(1) from tb_pt partition(sal_11);
&&&&&&& & COUNT(1)
&&&&&&& ----------
&&&&&&&&&&& && 300
&&&&&&& SQL& select count(1) from tb_pt partition(sal_other);
&&&&&&& & COUNT(1)
&&&&&&& ----------
&&&&&&&&&&& & 2873
&&&&&&& SQL& select * from tb_pt partition(sal_12) where rownum & 3;
&&&&&&& SAL_DATE&&&&& SAL_ID&&& SAL_ROW
&&&&&&& --------- ---------- ----------
&&&&&&& 01-JAN-12 -1.356E+09&&&&&&& 301
&&&&&&& 02-JAN-12 -&&&&&&& 302
相关资讯 & & &
& (07/29/:43)
& (07/29/:55)
& (08/11/:36)
& (07/29/:28)
& (07/29/:37)
& (04/08/:32)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款查看: 1640|回复: 7
分区表插入数据会造成所在分区的分区索引失效吗
论坛徽章:0
& &&&如题,建了一个分区表(range分区),用sqlldr导入数据,在导入过程中,发现索引不可用,数据插入结束后,分区索引正常,这种情况正常吗?
& &&&这张分区表数据量很大,不用索引查询很慢,可是强制索引,索引总是处于失效状态报错,这种情况该怎么办?
认证徽章论坛徽章:3
把索引rebuild一下
论坛徽章:121
正常,你用的是直接路径插入~ 索引会失效
论坛徽章:0
zergduan 发表于
正常,你用的是直接路径插入~ 索引会失效
那是不是只能改为非sqlldr方式插入数据&&才可以保证索引可用呢?
论坛徽章:121
theflyfly 发表于
那是不是只能改为非sqlldr方式插入数据&&才可以保证索引可用呢?
这跟你用什么工具加载数据无关,你自己在sqlldr控制文件中写了DIRECT=TRUE,是你要求他做直接路径插入的~
论坛徽章:121
invalid索引,rebuild即可
论坛徽章:0
明白了&&多谢
认证徽章论坛徽章:8
sqlldr这种数据加载方式,锁粒度和模式要比其他加载方式要求高,但加载过程中,应该只会影响当前正加载数据的分区,加载完成,该分区上的索引即可用,采用其他方式加载数据,效率会低些,所以,优化就是不断的取舍和权衡利弊,最终采用自己各方面都可接受的方案。
itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号:10 广播电视节目制作经营许可证:编号(京)字第1149号豆丁微信公众号
君,已阅读到文档的结尾了呢~~
数据仓库中数据查询优化方法的的研究与应用。pdf
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
数据仓库中数据查询优化方法的的研究与应用。pdf
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口}

我要回帖

更多关于 impdp 导入分区表 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信