精华内容
下载资源
问答
  • hive桶表

    千次阅读 2017-07-23 23:57:45
    hive中有桶的概念,对于每一个表或者分区来说,可以进一步组织成桶,其实就是更细粒度的数据范围。 hive采用列值哈希,然后除以桶的...hive桶表最大限度的保证了每个桶中的文件中的数据量大致相同,不会造成数据倾斜。

    hive桶表

    1 桶表的概念

    在hive中,数据库、表、分区都是对应到hdfs上的路径,当往表中上传数据的时候,数据会传到对应的路径下,形成新的文件,文件名的格式类似为00000_0…每次插入文件都会形成新的文件,命名也是有规律的,桶表就是对应不同的文件的。
    hive中有桶的概念,对于每一个表或者分区来说,可以进一步组织成桶,其实就是更细粒度的数据范围。
    hive采用列值哈希,然后除以桶的个数以求余数的方式确定该条记录是存放在那个表中。
    公式:whichBucket = hash(columnValue) % numberOfBuckets
    hive桶表最大限度的保证了每个桶中的文件中的数据量大致相同,不会造成数据倾斜。
    总结:桶表就是对一次进入表的数据进行文件级别的划分。

    2 使用桶表的好处

    1. 获得更高的查询处理效率,桶表加上额外的结构,hivee在处理有些查询的时候能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分桶的表,可以使用map端连接(map-side join)高效的实现。比如join操作。对于join操作两个表有一个相同的列,如果对这两个表都进行桶的操作。那么僵保存相同列值得桶进行join操作就可以了。可以大大尖山join的数据量。
    2. 使取样(sampling)更高效;在处理大规模数据集时,在开发和修改查询阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

    注意: clustered by 和sorted by不会影响数据的导入,这意味着,用户必须自己负责数据是如何导入的,包括数据的分桶和排序。

    桶表通常是和抽样联合使用的,桶表可以使数据分散存放,这是对每个文件进行抽样的话,就极大的保证了抽样的均衡性。如果数据姓谢的话就会导致抽样的不均匀。

    3 创建桶表的语法

    create table emp(id int, name string) 
    CLUSTERED BY (id) INTO 2 BUCKETS 
    row format delimited 
    fields terminated by '\t'
    lines terminated by '\n'
    stored as textfile;

    clustered by 后面加的列一定是在表中存在的列,后面接的是桶的个数,2意味着一次上传数据会根据id的hash值再与2取模,根据这个值决定这条数据落入那个文件中。

    hive> desc formatted emp;
    OK
    # col_name              data_type               comment
    
    id                      int
    name                    string
    
    # Detailed Table Information
    Database:               test
    Owner:                  yanzhelee
    CreateTime:             Sun Jul 23 08:15:16 PDT 2017
    LastAccessTime:         UNKNOWN
    Retention:              0
    Location:               hdfs://s200/user/hive/warehouse/test.db/emp
    Table Type:             MANAGED_TABLE
    Table Parameters:
            COLUMN_STATS_ACCURATE   {\"BASIC_STATS\":\"true\"}
            numFiles                0
            numRows                 0
            rawDataSize             0
            totalSize               0
            transient_lastDdlTime   1500822916
    
    # Storage Information
    SerDe Library:          org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
    InputFormat:            org.apache.hadoop.mapred.TextInputFormat
    OutputFormat:           org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
    Compressed:             No
    Num Buckets:            2
    Bucket Columns:         [id]
    Sort Columns:           []
    Storage Desc Params:
            field.delim             ,
            line.delim              \n
            serialization.format    ,
    Time taken: 0.157 seconds, Fetched: 33 row(s)
    

    准备一个原始表src_emp,其中的字段也是id和name,里面的内容随意,id递增。

    1,tom
    2,toms
    3,jerry
    4,bob
    5,tomas

    4 插入数据

    桶的数量意味着产生文件的数量,那么两个桶就应该使用2个reduce任务来完成,但是默认情况下hive至启动一个reducer,所以要修改reducer的数量,可以通过设置强制分桶机制来保证reducer数量和桶的数量一致。
    set hive.enforce.bucketing = true;
    这个一定要改成true,hive就会根据桶的数量启动reducer数量。
    注意:参数在设置的时候一定不能写错,hive是不提示错误的。

    然后将这个表中的数据查询出来插入到桶表中。
    insert into emp select * from src_emp;
    从启动的作业信息来看,reducer的数量被改成2,这样的结果 是会产生和桶数相同的文件数量。

    5 思考

    当使用了强制分桶的参数后,如果一次插入的数据量很少,那么会不会生成和桶数相同数量的文件呢?
    会的,强制分桶就是强制产生桶文件,不论一次插入的数量是多少,可能会有空的文件产生。

    参考博文

    http://www.cnblogs.com/wujin/p/6093401.html

    展开全文
  • Hive桶表

    2016-11-06 00:07:12
    首先创建普通内表: create table u( id int, name string, age int) row format delimited fields terminated by... 创建桶表(可以大大优化查询的速度): create table tu( id int, name string, age int)

       首先创建普通内表:

    create table u(
        id int,
        name string,
        age int)
    row format delimited fields terminated by ',';

        创建桶表(可以大大优化查询的速度):

    create table tu(
        id int,
        name string,
        age int)
    partitioned by (timeflag bigint)
    clustered by (id) sorted by (age) into 4 buckets
    row format delimited fields terminated by ',';

        上述代码,是将数据按照id的hash值分成4个桶,每个桶中按照age升序排序。

        向桶表插入数据:

        1. 方法一

    set mapred.reduce.tasks=4;
    insert overwrite table tu partition(timeflag=130732)
    select id,name,age from u distribute by id sort by age; //按id分组放入同一个文件中,且每个文件按照age升序,可以指定其他的列排序
        2. 方法二(推荐)

    set hive.enforce.bucketing=true;
    set hive.enforce.sorting=true;
    insert overwrite table tu partition(timeflag=130734)
    select id,name,age from u;    // 数据分桶且有序
        

    展开全文
  • hive 桶表的使用

    2020-05-31 17:07:20
    对于每一个表或者分区来说,可以进一步组织成 ...hive桶表最大限度的保证了每个桶中的文件中的数据量大致相同,不会造成数据倾斜。 但说是不会造成数据倾斜,但这是在业务无关的情况下,只要有真实业务在,肯定会发生数

    对于每一个表或者分区来说,可以进一步组织成 桶 ,其实就是更细粒度的数据范围。
    Bucket是对指定列进行 hash,然后根据hash值除以桶的个数进行求余,决定该条记录存放在哪个桶中。
    公式:whichBucket = hash(columnValue) % numberOfBuckets
    公式:要往哪个桶存 = hash(列值) % 桶的数量
    hive桶表最大限度的保证了每个桶中的文件中的数据量大致相同,不会造成数据倾斜。
    但说是不会造成数据倾斜,但这是在业务无关的情况下,只要有真实业务在,肯定会发生数据倾斜。
    总结:桶表就是对一次进入表的数据进行文件级别的划分。
    案例:多个国家的用户日志

    --创建桶表的语法格式
    CREATE EXTERNAL TABLE buckets_table(
    col ....)
    COMMENT 'This is the buckets_table table'
    PARTITIONED BY (`dt` string)
    CLUSTERED BY(col1) [SORTED BY(col2 [asc|desc])] INTO 2 BUCKETS
    LOCATION '.....'
    

    示例:

    -- 创建外部表桶表
    CREATE EXTERNAL TABLE user_install_status_buckets(
    `aid` string, 
    `pkgname` string, 
    `uptime` bigint, 
    `type` int, 
    `country` string, 
    `gpcategory` string)
    COMMENT 'This is the buckets_table table'
    PARTITIONED BY (`dt` string)
    CLUSTERED BY (country) 
    SORTED BY(uptime desc) 
    INTO 42 BUCKETS
    LOCATION 'hdfs://ns1/user/mydir/hive/user_install_status_buckets';
    
    --建partition 分区
    alter table user_install_status_buckets add if not exists partition (dt='20141228') location '20141228' partition (dt='20141117') location '20141117';
    

    在给分区插入数据的时候肯定有某些国家数据量大,某些少的情况

    --给分区插入数据
    insert overwrite table user_install_status_buckets partition(dt='20141228')
    select
    aid,pkgname,uptime,type,country,gpcategory
    from user_install_status_orc
    where dt='20141228';
    
    insert overwrite table user_install_status_buckets partition(dt='20141117')
    select
    aid,pkgname,uptime,type,country,gpcategory
    from user_install_status_orc
    where dt='20141117';
    

    桶中的数据文件:文件大小参差不齐,明显有数据倾斜现象
    桶中的数据文件
    桶表抽样:
    当数据量特别大时,对全体数据进行处理存在困难时,抽样就显得尤其重要了。
    抽样可以从被抽取的数据中估计和推断出整体的特性,是科学实验、质量检验、社会调查普遍采用的一种经济有效的工作和研究方法。

    桶表抽样的语法如下:table_sample: TABLESAMPLE (BUCKET x OUT OF y [ON colname])
    当创建桶表的字段和抽样字段一致的时候,抽样时不扫描全表,直接输入指定的桶文件。

    select * from user_install_status_buckets tablesample(bucket 11 out of 84 on country);
    

    上面的语句指定抽取第11个桶的一半,但是如果第11个桶中没有第二个country,就会把所有记录全部抽取出来。
    在这里插入图片描述

    展开全文
  • 因为数据异常,需要在hive桶表中插入历史分区数据,一开始的SQL: insert overwrite table桶表partition(partition='2020-10-30') select * from分区表twhere t.partition='2020-10-30' 报错: org.apache....

    主题:hive插入数据

    因为数据消费异常,需要在hive桶表中插入历史分区数据,一开始的SQL:

    insert overwrite table 桶表 partition(partition='2020-10-30')
    select * from 分区表 t where t.partition='2020-10-30' 

    报错:

    org.apache.hive.service.cli.HiveSQLException: Error while compiling statement: FAILED: SemanticException [Error 10295]: INSERT OVERWRITE not allowed on table with OutputFormat that implements AcidOutputFormat while transaction manager that supports ACID is in use
    	at org.apache.hive.jdbc.Utils.verifySuccess(Utils.java:266)
    	at org.apache.hive.jdbc.Utils.verifySuccessWithInfo(Utils.java:252)
    	at org.apache.hive.jdbc.HiveStatement.runAsyncOnServer(HiveStatement.java:309)
    	at org.apache.hive.jdbc.HiveStatement.execute(HiveStatement.java:250)
    	at org.apache.commons.dbcp2.DelegatingStatement.execute(DelegatingStatement.java:291)
    	at org.apache.commons.dbcp2.DelegatingStatement.execute(DelegatingStatement.java:291)
    	at org.apache.zeppelin.jdbc.JDBCInterpreter.executeSql(JDBCInterpreter.java:580)
    	at org.apache.zeppelin.jdbc.JDBCInterpreter.interpret(JDBCInterpreter.java:692)
    	at org.apache.zeppelin.interpreter.LazyOpenInterpreter.interpret(LazyOpenInterpreter.java:95)
    	at org.apache.zeppelin.interpreter.remote.RemoteInterpreterServer$InterpretJob.jobRun(RemoteInterpreterServer.java:490)
    	at org.apache.zeppelin.scheduler.Job.run(Job.java:175)
    	at org.apache.zeppelin.scheduler.ParallelScheduler$JobRunner.run(ParallelScheduler.java:162)
    	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
    	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    	at java.lang.Thread.run(Thread.java:745)
    Caused by: org.apache.hive.service.cli.HiveSQLException: Error while compiling statement: FAILED: SemanticException [Error 10295]: INSERT OVERWRITE not allowed on table with OutputFormat that implements AcidOutputFormat while transaction manager that supports ACID is in use
    	at org.apache.hive.service.cli.operation.Operation.toSQLException(Operation.java:388)
    	at org.apache.hive.service.cli.operation.SQLOperation.prepare(SQLOperation.java:193)
    	at org.apache.hive.service.cli.operation.SQLOperation.runInternal(SQLOperation.java:276)
    	at org.apache.hive.service.cli.operation.Operation.run(Operation.java:324)
    	at org.apache.hive.service.cli.session.HiveSessionImpl.executeStatementInternal(HiveSessionImpl.java:499)
    	at org.apache.hive.service.cli.session.HiveSessionImpl.executeStatementAsync(HiveSessionImpl.java:486)
    	at sun.reflect.GeneratedMethodAccessor61.invoke(Unknown Source)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    	at java.lang.reflect.Method.invoke(Method.java:498)
    	at org.apache.hive.service.cli.session.HiveSessionProxy.invoke(HiveSessionProxy.java:78)
    	at org.apache.hive.service.cli.session.HiveSessionProxy.access$000(HiveSessionProxy.java:36)
    	at org.apache.hive.service.cli.session.HiveSessionProxy$1.run(HiveSessionProxy.java:63)
    	at java.security.AccessController.doPrivileged(Native Method)
    	at javax.security.auth.Subject.doAs(Subject.java:422)
    	at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1698)
    	at org.apache.hive.service.cli.session.HiveSessionProxy.invoke(HiveSessionProxy.java:59)
    	at com.sun.proxy.$Proxy33.executeStatementAsync(Unknown Source)
    	at org.apache.hive.service.cli.CLIService.executeStatementAsync(CLIService.java:295)
    	at org.apache.hive.service.cli.thrift.ThriftCLIService.ExecuteStatement(ThriftCLIService.java:506)
    	at org.apache.hive.service.rpc.thrift.TCLIService$Processor$ExecuteStatement.getResult(TCLIService.java:1437)
    	at org.apache.hive.service.rpc.thrift.TCLIService$Processor$ExecuteStatement.getResult(TCLIService.java:1422)
    	at org.apache.thrift.ProcessFunction.process(ProcessFunction.java:39)
    	at org.apache.thrift.TBaseProcessor.process(TBaseProcessor.java:39)
    	at org.apache.hive.service.auth.TSetIpAddressProcessor.process(TSetIpAddressProcessor.java:56)
    	at org.apache.thrift.server.TThreadPoolServer$WorkerProcess.run(TThreadPoolServer.java:286)
    	... 3 more
    

    SQL改为:

    insert into table 桶表 partition(partition='2020-10-30')
    select * from 分区表 t where t.partition='2020-10-30' 

    成功插入新数据!

    原因应该是和桶表支持事务有关系。

     

    展开全文
  • <p>sqoop如何把hive桶表导出到Postgresql,有没有人遇到过?</p>
  • hive桶表好处

    2017-09-27 13:19:00
    对于每一个表(table)或者分区, Hive可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分。Hive也是针对某一列进行桶的组织。...我们先准备我们将使用的分桶表的数据.1,jack,2016/11/112,...
  • Hive桶表的操作

    2017-08-21 21:35:10
    桶表:桶表是文件。 -------------- //创建桶表 CREATE TABLE buck ( id int, name string , age int ) CLUSTERED BY (id) INTO 3 BUCKETS ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES ...
  • 前言 本文隶属于专栏《1000个问题搞定大数据技术体系》,该...不可以,因为 load 数据的话 HDFS 下只会有一个文件无法完成分的效果,分和 MapReduce 中的分区是一样的道理,所以我们要借助中间导入数据。 ...
  • 概念 桶表就是对数据进行hash取值,然后放在不同的文件...物理上来讲,桶表就是表目录下的一个文件,桶表的数量和reduce任务数量是相等的。 作用 抽样调查 每篇一言: 知而不行,谓之不诚。 行而不成,谓之不能。 ...
  • 桶表加载数据的时候报错Cannot run job locally: Number of reducers (= 4) is more than 1。首先创建桶表 create table emp_bu_2( empno int, ename string, job string, mgr int, hiredate string, sal ...
  • Hive桶表

    2021-04-05 09:09:51
    Hive桶表
  • 【大数据Hive系列】 Hive分区表和分桶表
  • Hive桶表

    千次阅读 2017-02-05 14:29:42
    hive桶表
  • hive桶表

    2019-06-21 15:18:34
    昨天转载了朋友的博客 里面有分桶表的描述,今天自己好好的练习了,再整理记录一下: 首先是修改了一个文件 在我这的路径是: /opt/software/hive-1.2.1/conf/hive-site.xml 在这其中添加一些配置: <...
  • Hive桶表入门

    千次阅读 2019-11-29 21:49:12
    什么是分桶表 将数据按照指定的字段进行分成多个桶中去,说白了就是将数据按照字段进行划分,可以将数据按照字段划分到多个文件当中去 开启分桶表功能 set hive.enforce.bucketing=true; 设置reduce的个数 set ...
  • Hive桶表

    2019-11-02 15:18:58
    什么是桶表 在前面,我们讲到了内部表和外部表,以及使用分区表对数据进行细分管理。其实对于每一个表或者分区,Hive还可以进行更为细颗粒的数据细分划分和管理,也就是桶(Bucket)。Hive也是针对某一列进行桶的...
  • hive表之桶表

    2018-04-23 09:41:26
    hive表之桶表桶表是对数据进行哈希取值后,对桶数取余,根据余数放到不同的文件中进行存储,比如可以针对表中某一列进行哈希,这样可以降低系统的热块,提高查询速度举例 hive&gt;create table bucket_table...
  • Hive分区表和分桶表

    2021-01-12 17:30:17
    Hive分区表和分桶表前言一、分区表Partition Informationcol_name data_type comment二、分桶表1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这...
  • 大数据-Hive桶表

    2019-12-24 09:35:43
    1.5. 分桶表 将数据按照指定的字段进行分成多个桶中去,说白了就是将数据按照字段进行划分,可以将数据按照字段划分到多个文 件当中去 开启 Hive 的分桶功能 set hive.enforce.bucketing=true; 设置 Reduce 个数 ...
  • hive桶表

    2020-06-26 11:27:01
    桶表 与分区的分目录不同,分桶是将数据按照指定的字段进行划分到多个文件当中去,分桶就是MapReduce中的分区. 分桶规则:对分桶字段值进行哈希,哈希值除以桶的个数求余,余数决定了该条记录在哪个桶中,也就是...
  • Hive桶表&分区表

    2020-10-03 11:39:04
    Hive桶表&分区表 分区表 Hive存在的问题:hive中没有索引机制,每次查询的时候,hive会暴力扫描整张表.MySQL具有索引机制. 因为没有分区,所以hive搞了一个分区表的机制.在建表的时候,加上分区字段,然后会在表的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,461
精华内容 4,984
关键字:

hive桶表