hive表新增字段后,新字段无法写入的问题 -- cascade

hive表新增字段后,新字段无法写入的问题 -- cascade,第1张

实际应用中,常常存在修改数据表结构的需求,比如:增加一个新字段。

如果使用如下语句新增列,可以成功添加列col1。但如果数据表tb已经有旧的分区(例如:dt=20190101),则该旧分区中的col1将为空且无法更新,即便insert overwrite该分区也不会生效。

解决方法:

解决方法很简单,就是增加col1时加上cascade关键字。示例如下:

加深记忆的方法也很简单,cascade的中文翻译为“级联”,也就是不仅变更新分区的表结构(metadata),同时也变更旧分区的表结构。

ADD COLUMNS lets you add new columns to the end of the existing columns but before the partition columns. This is supported for Avro backed tables as well, for Hive 0.14 and later.

REPLACE COLUMNS removes all existing columns and adds the new set of columns. This can be done only for tables with a native SerDe (DynamicSerDe, MetadataTypedColumnsetSerDe, LazySimpleSerDe and ColumnarSerDe). Refer to Hive SerDe for more information. REPLACE COLUMNS can also be used to drop columns. For example, "ALTER TABLE test_change REPLACE COLUMNS (a int, b int)" will remove column 'c' from test_change's schema.

The PARTITION clause is available in Hive 0.14.0 and latersee Upgrading Pre-Hive 0.13.0 Decimal Columns for usage.

The CASCADE|RESTRICT clause is available in Hive 1.1.0. ALTER TABLE ADD|REPLACE COLUMNS with CASCADE command changes the columns of a table's metadata, and cascades the same change to all the partition metadata. RESTRICT is the default, limiting column changes only to table metadata.

如何创建索引 : 使用T-SQL语句创建索引的语法: CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED]      INDEX   index_name      ON table_name (column_name…)       [WITH FILLFACTOR=x]        UNIQUE表示唯一索引,可选        CLUSTERED、NONCLUSTERED表示聚集索引还是非聚集索引,可选        FILLFACTOR表示填充因子,指定一个0到依00之间的值,该值指示索引页填满的空间所占的百分比   在stuMarks表的writtenExam列创建索引: USE stuDB GO IF EXISTS (SELECT name FROM sysindexes           WHERE name = 'IX_writtenExam')    DROP INDEX stuMarks.IX_writtenExam  /*--笔试列创建非聚集索引:填充因子为三0%--*/ CREATE NONCLUSTERED INDEX IX_writtenExam      ON stuMarks(writtenExam)           WITH FILLFACTOR= 三0 GO /*-----指定按索引 IX_writtenExam 查询----*/ SELECT * FROM stuMarks  (INDEX=IX_writtenExam)     WHERE writtenExam BETWEEN 陆0 AND 90 虽然我们可以指定SQL Server按哪个索引进行数据查询,但一般不需要我们人工指定。SQL Server将会根据我们创建的索引,自动优化查询

注意:以下SQL不会转为Mapreduce来执行,Explain用于显示执行计划,可以来验证sql是否发生mapreduce

        select仅查询本表字段

        where仅对本表字段做条件过滤

比如下面的语句是会发生mapreduce的(下面的reduce没有截图)

        (1)集群模式:hive默认采用的是集群的方式

        (2)本地模式:首先开启本地模式,测试的时候就可以以本地模式来节省集群资源

                set hive.exec.mode.local.auto=true

        注意:hive.exec.mode.local.auto.inputbytes.max默认值为128M表示加载文件的最大值,若大于该配置仍会以集群方式来运行

通过设置以下参数开启并行模式:默认是不开启并行计算,这是job是线性执行的

set hive.exec.parallel=true多个job并行执行提高效率

注意:hive.exec.parallel.thread.number(一次SQL计算中允许并行执行的job个数的最大值)

通过设置以下参数开启严格模式:

set hive.mapred.mode=strict(默认为:nonstrict非严格模式)

开启严格模式后,查询会有限制:

    (1)对于分区表,必须添加where对于分区字段的条件过滤,因为hive中的数据量一般都很大,避免全表扫描不添加会执行失败,非分区表正常查询

    (2)order by语句必须包含limit输出限制;还是为了避免全表扫描

    (3)限制执行笛卡尔积的查询。

(1)Order By - 对于查询结果做全排序,只允许有一个reduce处理(当数据量较大时,应慎用。严格模式下,必须结合limit来使用)

(2)Sort  By - 对于单个reduce的数据进行排序

(3)Distribute By - 分区排序,经常和Sort By结合使用

(4)Cluster By - 相当于 Sort By +Distribute By(Cluster By不能通过asc、desc的方式指定排序规则;可通过 distribute by column sort by column asc|desc 的方式)

Join计算时,将小表(驱动表)放在join的左边

Map Join:在Map端完成Join,join *** 作对应mapreduce是reduce阶段,因为shuffle,跟reduce阶段比较浪费时间,所以才有了map  join

两种实现方式:

(1)SQL方式,在SQL语句中添加MapJoin标记(mapjoin hint)

(2)开启自动mapjoin : 通过修改以下配置启用自动的map join:

set hive.auto.convert.join = true(该参数为true时,Hive自动对左边的表统计量,如果是小表就加入内存,即对小表使用Map

join)

相关配置参数:

hive.mapjoin.smalltable.filesize(大表小表判断的阈值,如果表的大小小于该值则会被加载到内存中运行)

hive.ignore.mapjoin.hint;(默认值:true;是否忽略mapjoin hint 即mapjoin标记)

hive.auto.convert.join.noconditionaltask(默认值:true;将普通的join转化为普通的mapjoin时,是否将多个mapjoin转化为一个mapjoin)

hive.auto.convert.join.noconditionaltask.size(将多个mapjoin转化为一个mapjoin时,其表的最大值)    

通过设置以下参数开启在Map端的聚合:

set hive.map.aggr=true开启后,map预聚合,相当于map端reduce减轻reduce 端压力

相关配置参数:

hive.groupby.mapaggr.checkinterval:map端group by执行聚合时处理的多少行数据(默认:100000)

hive.map.aggr.hash.min.reduction:进行聚合的最小比例(预先对100000条数据做聚合,若聚合之后的数据量/100000的值大于该配置0.5,则不会聚合)

hive.map.aggr.hash.percentmemory:map端聚合使用的内存的最大值

hive.map.aggr.hash.force.flush.memory.threshold:map端做聚合 *** 作是hash表的最大可用内容,大于该值则会触发flush

hive.groupby.skewindata: 是否对GroupBy产生的数据倾斜做优化,默认为false,当设置为true时,会进行两次mr,第一次把数据map端随机分配分区,达到均衡数据的目的,第二次进行正常的分区算法执行mr

文件数目小,容易在文件存储端造成压力,给hdfs造成压力,影响效率

设置合并属性

        是否合并map输出文件:hive.merge.mapfiles=true

        是否合并reduce输出文件:hive.merge.mapredfiles=true

        合并文件的大小:hive.merge.size.per.task=256*1000*1000

去重统计

        数据量小的时候无所谓,数据量大的情况下,由于COUNT DISTINCT *** 作需要用一个Reduce

Task来完成,这一个Reduce需要处理的数据量太大,就会导致整个Job很难完成,一般COUNT DISTINCT使用先GROUP

BY再COUNT的方式替换

由于maptask的数量一般跟切片数量有关,所有我们主要对reduce端设置数量

Map数量相关的参数

        mapred.max.split.size: 一个split的最大值,即每个map处理文件的最大值

        mapred.min.split.size.per.node:一个节点上split的最小值

        mapred.min.split.size.per.rack:一个机架上split的最小值

Reduce数量相关的参数

        mapred.reduce.tasks:强制指定reduce任务的数量

        hive.exec.reducers.bytes.per.reducer:每个reduce任务处理的数据量

        hive.exec.reducers.max:每个任务最大的reduce数

适用场景:

        (1)小文件个数过多

        (2)task个数过多

通过 set mapred.job.reuse.jvm.num.tasks=n来设置(n为task插槽个数)个人理解优点类似于各种连接池的作用

缺点:设置开启之后,task插槽会一直占用资源,不论是否有task运行,直到所有的task即整个job全部执行完成时,才会释放所有的task插槽资源!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11886884.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存