大数据组件综合笔记(二)

本文涉及的产品
简介: Hadoop:Hadoop是一个分布式存储和计算框架,具有高可靠, 高扩展, 高容错的特点(数据副本和集群);由底层HDFS分布式文件系统负责存储,和MapReduce负责分布式计算,以及后续增加的yarn负责资源协调管理。

Hive数据的导入和导出


Hive数据导入:

第一种,用load data导入数据:

load data [local] inpath 'dataPath' override | into table student [partition 分区值];

第二种,创建表时指定location数据路径,后面如果该路径本身有数据会导入到表中,如果是空文件可以用手动上传数据文件到hdfs中:

hdfs fs -put /opt/bigdata/student.txt /user/hive/warehouse/student1

第三种,可以在建表时as select * from 某张表,也可以insert into|override table时select * from某张表。

最后一种是直接import table,导入某个数据文件,前提是数据文件要先export准备好。


Hive数据导出

第一种是insert导出:可以insert导出到本地或者hdfs,还可以指定导出文件后的分隔符

#加local导出到本地路径,默认文件分隔符时“\001”,之后本地会生成一个日志型的文件。
insert override local directory '/opt/bigdata/student';
#格式化导出文件
insert override local directory '/opt/bigdata/student' row format delimited fields terminated by ',';
#这里没有local
insert override directory '/export/student' row format delimited fields terminated by ',';

第二种是Hadoop命令直接下载,由于表和数据有映射关系,每张表在hdfs上都能找到对应数据存储位置,所以我们可以直接下载下来的,后期要检查下数据和分隔符是否有问题。

hdfs fs -get /usr/hive/warehouse/student/student.txt /opt/bigdata/data

第三种是Hive shell命令导出,hive命令后面加-e或-f选项,再加sql查询语句指定到某个目录下,比如:

#1.hive -e “sql语句” >> file; 这种是直接执行sql语句,把结果导出到文件中。
#2.hive -f "sql文件" > file; 这种是执行完sql文件后,将查询结果写入到file中
bin/hive -e 'select * from default.student;' >> /opt/bigdata/student.txt

最后一种是export导出到hdfs

hive>export table student to '/usr/hive/warehouse/student';

Hive的文件存储格式和压缩方式:这里不做介绍,因为了解不深,只知道hive的压缩可以发生在map shuffle阶段中向磁盘写数据时压缩,以及reduce输出结果时作压缩。企业有效方式文件存储压缩是采用orc + snappy方式。

Hive的SerDe 序列化和反序列化,是使用Serde对行对象序列化和反序列化,方便数据加载到表中,最后实现把文件内容映射到hive表。如下所示:

HDFS file -> InputFileFormat -> key,value -> Deserializer(反序列化) -> Row object

Row object -> Serializer(序列化) -> key,value -> OutputFileFormat -> HDFS file

建表时可以指定row format来使用SerDe。常用于企业解决多字符分割场景

最后Hive重要的一点是Hive的调优,参考下面另一个问题的答案:8. 数据倾斜现象和解决办法?(重要)

2. 将数据直接传到HDFS分区目录上,怎么让分区表和数据产生关联?

因为上传到hdfs后,hive没有对应元数据信息所以无法查询到对应数据。可以上传数据后给分区表添加该目录的分区

dfs -mkdir -p 分区目录

dfs -put 分区数据

hive>alter table 表明 add partition(分区);

3. 桶表是否可以直接通过load将数据导入?

不可以,因为load数据的话hdfs下只会有一个文件无法完成分桶的效果,需要通过中间表导入数据

4. hive的分区可以提高效率,那么分区是否越多越好?为什么?

不是越多越好

hive底层是存储在hdfs上的,hdfs是适合存储大文件而不适合小文件,如果有越多的分区,那么会增加namenode的负担。

hive会转化成mr程序,mr会转化为多个task任务,多个小文件的话,每个文件一个task,每个task运行一个JVM实例,JVM的开启和销毁都会降低系统性能。

所以分区数要合理设计,一般在3个以内。

5. 什么情况下Hive可以避免进行mapreduce?

如果是进行简单的查询,直接select,不带count,sum这些聚合函数的,都不会走mapreduce,而是直接读取hdfs目录中的文件。(fetch抓取)

另外如果查询语句中的过滤条件只是分区字段的情况下,也不会走mapreduce(fetch抓取)

select * from order_partition where month = '2019-03';

还有就是可以手动设置,让hive使用本地模式,当然这种有限制,需要查询的文件不超过256M或者文件数量不超过4个,否则系统还是会自动走mapreduce

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

6. order by ,sort by , distribute by , cluster by 的区别?

Order by会对所给的全部数据进行全局排序,只启动一个reduce来处理。

Sort by是局部排序,它可以根据数据量的大小启动一到多个reducer来工作,并且在每个reduce中单独排序。

Distribute by 类似于mr中的partition,采用hash算法,在map端将查询结果中hash值相同的结果分发到对应的reduce中,结合sort by使用

Cluster by 可以看作是distribute by 和sort by的结合,当两者后面所跟的字段列名相同时,效果就等同于使用cluster by,但是cluster by最终的结果只能是降序,无法指定升序和降序。

7. 如何将数据以动态分区的方式插入分区表中?

1.首先创建对应分区表和一张普通表

2.然后将数据加载到普通表

load data local inpath '/opt/bigdata/order_partition' into table tt_order;

3.最后利用普通表来将数据加载到动态分区表中

#先设置使用动态分区的参数和使用非严格模式
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
#然后通过普通表导入分区表
insert into table order_partition partition(year,month) select order_number,order_price,substring(order_time,0,4) as year,substring(order_time,6,12) as month from tt_order;
#注意导入的字段顺序,分区键一定要放在最后,否则会报错。

8. 数据倾斜现象和解决办法?(重要)

1.什么是数据倾斜?

大量相同特征的key出现在同一个reduce任务中,或者某个key对应的数据量远超过其它key的数据量,这种导致数据分布不均匀的现象就叫做数据倾斜。

2.数据倾斜的现象

在执行任务的时候,任务进度长时间卡在99%左右,查看任务监控页面或者详细日志信息,发现只有少量,一个或者几个reduce子任务没有跑完,主要因为这几个reduce任务处理的数据量和其它reduce任务差异过大。这种单一reduce任务的记录数与平均记录数差异过大,就会极大拖长计算时间。

现实工作中可能会遇到这样的情况比较多:比如大表join小表,其中小表有特别的key值比较集中,这样分发到某一个reduce上的数据就会高于平均值;或者是大表join大表中,作为连接判断的字段0值或者空值较多的,这些0值和空值后续都会由一个reduce处理,导致这个reduce处理量过多;再有的情况就是group by、**count( distinct )**某个字段值数据多而导致reduce处理耗时的情况。

3.数据倾斜的原因

key分布不均匀,比如空值,0值

业务数据本身的特性。

建表时考虑不周,导致后期join操作时数据倾斜

某些sql语句本身就有数据倾斜。比如用count(distinct),它会单独用一个reduce来计算统计,如果数据量很大,就会导致整个job很难完成。这种情况可以先用group by分出需要统计的字段,再进行sum或者count

4.数据倾斜的解决方案,有三个层面可以思考处理:

第一,SQL语句调优

查询语句加上具体需要的列和分区键,有些复杂表的字段会存储json格式的文本,这些字段不一定是需要查询的就可以过滤掉,减轻reduce计算负担

大表join小表时用map jion,让小表先进内存,然后大表与小表在map端完成join操作,避免reduce端处理。

大表join大表中,可以把空值的key变成一个字符串然后加上rand()随机数,后续mr的分区操作会把倾斜的数据重新分发到不同的reduce上,从而避免数据倾斜。或者在join 的on条件中先让key为空的值 不参与关联,等key不为空的数据相互合并连接后再union all加回key为空的数据。

select * from a left outer join b
on case where id is null then concat('任意字符串',rand()) else id end = b.id;
select * from log a join users b on a.id is not null and a.id = b.id
union all
selct * from log a where a.id is null;
查询语句中count(distinct) 改成group by + sum(),比如
select count(distinct id) from test; ==> select sum(id) from (select id from test group by id); 这种可能会多开一个reduce来完成group by的操作,但会明显提高查询速度。

针对不同数据类型产生的数据倾斜,存在这样的情况,A表中的id字段的数据类型是int,但join的B表中id字段存在脏数据,有一些是int类型但也有string类型的,那么再join操作时,默认的hash操作就会对int类型的key进行分配,而对于string类型的key会被统一分配到一个reduce中,这种情况就需要先进行类型转换,如 a join b on a.id = cast(b.id as int);

还有一些时候可以把数据倾斜的数据单独拿出来处理,然后再union all回去。

第二,通过设置hive参数配置解决,这种主要是优化计算速度,避免数据倾斜发生


开启map端聚合


并不是所有的聚合操作都需要在reducec端完成,很多聚合操作都可以现在map端先进行部分聚合,最后在reduce端得出最终结果(类似于mr过程中的combiner,预先合并压缩数据,再提供给reduce统计计算)

再hive开启map端聚合后,一旦发现数据倾斜,系统就能自动负载均衡,把相同特征的key分发到不同的reduce中,主要通过hive.groupby.skewindata参数完成。

#开启map端聚合的设置
#是否在map段進行聚合,默认是true
set hive.map.aggr = true
#在map端进行聚合操作的条目数目
set hive.groupby.mapaggr.checkinterval = 100000;
#有数据倾斜的时候进行负载均衡,比如把相同特征的key分发到不同的reduce中(默认是false)
set hive.groupby.skewindata = true;
设置并行执行
和oracle一样也可以利用并行执行提高查询速度,不同的是hive是靠参数来空值的
#开启并行执行
set hive.exec.parallel = true;
#设置同一个sql允许的最大并行度,默认是8
set hive.exec.parallel.thread.number = 16;

设置压缩

压缩可以在map端要进行shuffle时压缩和在完成reduce输出时压缩
Hive表中间数据压缩
#设置为true为激活中间数据压缩功能,默认是false,没有开启
set hive.exec.compress.intermediate = true;
#设置中间数据的压缩算法
set mapred map.output.compression = codec = org.apache.hadoop.io.compress.SnappyCodec;

Hive表最终输出结果压缩

set hive.exec.compress.output = true;
set mapred map.output.compression = codec = org.apache.hadoop.io.compress.SnappyCodec;

推测执行

说简单点就是Hadoop用了一个备份任务来同时执行,跟原来的任务相比较,谁先执行完成就用谁的计算结果作为最终的计算结果。具体定义如下:

Hadoop采用了推测执行机制,它根据一定的法则推测出”拖后腿“的任务,并为这样的任务启动一个备份任务,让备份任务和原始任务同时处理一份数据,并最后选择优先执行完成的任务计算结果作为最终结果。

#开启推测执行机制

set hive.mapred.reduce.tasks.speculative.exection = true;

JVM重用

JVM重用可以使得JVM实例在同一个job中重新使用多次,减少进程的启动和销毁时间

#设置jvm重用个数
set mapred.job.reuse.jvm.num.tasks = 5;

合理设置map数和reduce数

在map执行之前将小文件合并可以减少map数

#系统默认的格式,可以不用设置。
set hive.input.format = org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

对复杂文件可以增加map数

增加map方法有一个公式:

compute(SliteSize(Math.max(minSize,Math.min(maxSize,blocksizs))))公式

- 调整maxSize最大值,让maxSize小于blocksize就可以增加map数

- minSize默认等于1,maxSize默认等于blockSize大小。

#比如这样设置就可以达到增加map数的效果
#设置每个map处理的文件maxSize大小为10M,这样小于一个block128M的话,系统就会分配更多10M的map来处理复杂任务。
set mapreduce.input.fileinputformat.split.maxsize = 10485760;

合理设置Reduce数,比如设置每个job中reduce的个数为3个

set mapreduce.job.reduces = 3;

第三,修改MR程序去避免数据倾斜

可以在MR程序的reduce方法中追踪每个键的最大值,并且设置阈值,当超过该阈值时就可以认为发生了数据倾斜,然后输出到日志文件进行分析。

第二种是在编写MR程序时,从业务层面去考虑自定义的分区键是否合理。就跟ADS库建表时可以默认指定哪个字段作为分区键。

MR程序中改用TotalOrderPartitioner替换HashPartitioner,它可以通过对原始数据进行抽样得到的结果集来预设分区边界值,也就是能找出导致数据倾斜的key值,再分散处理。

MR程序中使用Combiner。


数据仓库


1.介绍一下对数据仓库的理解?

数据仓库是面向业务主题,为分析数据而设计的。

通俗来讲,数据仓库就像生活中的普通仓库一样,能对物品集中管理、分类摆放、按需取用,最终目的都是为了更方便和更快速地查询到想要的数据结果,提供数据支持和决策支持。

打比方:对多来源的数据做元数据管理就像对物品打标签一样,而ETL抽取的过程和数据分层建模的过程则类比物品分类摆放的过程,期间有些需要抽样研究的就作为数据挖掘和机器学习的数据,有些使用频率非常高的就单独拿来做实时查询,对于不怎么改动的历史数据就按主题抽取另外分析查询,而市面上像阿里云这类的平台工具就好比放物品的货架。


总结来说,它的特点有:

第一,面向主题:面向主题是指数仓中的数据是按照一定的业务主题划分组织的,能帮助用户做决策和分析探索。

第二,集成性:数仓的数据来源于其他源系统,可以使用各种ETL工具集成汇总到数仓。

第三,稳定性:数仓主要是为了决策分析,它存储大量的历史数据,一般只有新增,没有更新操作;

第四,时变性:时变性是指它具有时间属性,可以不断生成主题的新数据,比如按年月日的增量数据。

2.什么是维度、事实表、维度表、数据集市、粒度?


粒度:粒度反映了数据仓库按照不同的层次组织数据,根据不同的查询需要,存储不同细节的数据,粒度越小,数据越细,查询范围就越广泛;粒度大就越不够细节。

维度:看待事物的角度,

维度表:一般是对事实的描述信息,可以看做是用户分析数据的窗口,包含了事实数据的特性。每一张维度表对应显示世界中的一个对象或者概念,比如用户类型、商品、日期、地区等。

事实表:包含对分析事物的一个或多个度量值(指标)。

指标:可以理解为统计的销售额、转账额等这样的业务统计数。

度量:可以是事实表中存放数值型或者连续次数的字段。

3.数据仓库系统的数据质量如何保证?

4.描述一下OLTP和OLAP的区别

OLAP 联机分析处理

是数据仓库系统最主要的应用

数据量大,适合大数据量查询

实时性要求不高、DML操作不频繁

支持复杂的分析操作

侧重决策支持

并且提供直观易懂的查询结果

OLTP 联机事务处理

是传统关系型数据库的主要应用

数据量小

要求实时、DML操作频繁

并行事务处理多,强调数据库处理效率

5.数据仓库常用的两种模型及其特点?

星型模型:事实表和多个维度表关联,维度表的主键是事实表的外键,维度表不能继续拥有维度表。

优点:逻辑简单,join时不需要关联太多表,有较好的查询性能

缺点:维度表存储太多信息,数据冗余度大不利于扩展;另一个是需要做大量数据预处理工作

雪花模型:在星型模型基础上,约定维度表可以继续向外延伸拥有维度表。

优点:数据冗余度低,扩展性好

缺点:当维度表的层次变多时,可读性差,并且发展到业务后期维护困难;join时关联多表查询性能较低。

6.构建数仓应该有哪些过程?

(1)明确需求,分析数据的业务场景;

(2)分析数据结构,做好元数据管理。

(3)设计数据仓库架构分层,确定数据模型、主题、维度、粒度以及维度表事实表等

(4)制定各项规范,包括命名规范、字段规范、编码规范等;

(5)ETL作业开发和测试,以及数据质量检查;

(6)数据监控,数仓维护,模型优化。

7.ETL流程应该有哪些?


优化相关


1.MaxCompute SQL中用到哪些优化?

首先优化SQL的过程,实际上就是要尽可能减少IO读取,尽可能减少计算资源的使用,尽可能减少SQL复杂度,尽可能提升运行速度。

建分区表,但建议分区层数不超过3层,后续查询时为了避免全表扫描需要分区裁剪,分区值尽量常量化,避免不可确定值;插入数据时尽量采用写入静态分区的方式,优化数据存储,如果用动态分区,会生成较多的小文件,增加系统负担。

只select有效列,并用limit限制返回的条数。

读取相同源表时可以合并成一条sql,系统会优化只读取一次。

mapjoin优化

将full outer join 改为left outer join + union all 并对小表使用上mapjoin

尽可能保证表达式两边的数据类型一致,如果发生隐式转换容易造成精度问题,比如string和bigint都转成double来相等比较,悲观情况下,可能触发数据倾斜。这时要cast显式转换一下

少用distinct,容易触发数据倾斜,count(distinct)处理的时间会很长可以转换成count()+ group by

多个表join时,join顺序很重要,优先选择join结果输出小的表先关联,能有效减少中间数据量,节省IO和计算资源。

尽量使用内置的UDF函数和窗口函数,内置UDF在实现做了很多优化,运行块,省资源,窗口函数本身能处理很多复杂问题。

尽量避免Order by,order by会触发全局排序,只能单点运行,效率低,如果业务允许,可以改成distribute by + sort by

2.MaxCompute SQL介绍以及与通用数据库的区别?

MaxCompute SQL适用于海量数据,实时性要求不高的场合,MaxCompute 作业提交后会有几十秒到数分钟不等的排队调度;采用的是类似与SQL的语法,可以看作是标准SQL的子集,但也有不同点,比如没有事务,主键约束,索引等。

有Bigint,double,String,datetime,Boolean,decimal类型。

可以设置分区表,还可以给表指定生命周期LifeCycle。


具体区别如下:

1.MaxCompute表不⽀持主键、索引和字段约束;

2.MaxCompute表不⽀持UPDATE语句和DELECT语句,只能DROP 整个表或者某一分区数据;

3.MaxCompute表创建表时不允许指定默认值,可以指定生命周期,周期结束后自动清除数据;

4.SELECT语句输出的数据⾏数是受限制的,最⼤为10000条;

5.MaxCompute 不支持主键,索引,不支持MINUS操作,MaxCompute的where子句也不支持between条件查询。

6.MaxCompute把sql的关键字做为保留字,对列,表或是分区命名时不能直接使用保留字作命名。

7.插入语句有insert into | overwrite into,overwrite into写入前会清空表数据;

8.可以直接在select中使用mapjoin,所有小表占用的内存总和不得超过512MB,在官方文档中说mapjoin最多支持6张小表,但工作中我们是规定不能超过8张小表,因为有些表真的容量不大。

9.MaxCompute SQL不支持顶级的两个查询结果合并,要改写为一个子查询的形式,也就是一个union all连接的语句,外面必须套一层select * from。

10.MaxCompute也有内置函数,和大部分数据库的用法差不多,如果忘记可以直接查看官方文档。

MaxCompute常用到的函数:dateadd函数对日期加减法,datediff计算两个日期差值,getdate获取系统日期,cast转换目标数据类型, coalesce函数返回列表中第一个非空的值,case when;decode实现if-then-else分支选择的功能,concat连接所有字符串,instr函数计算子串在字符串中的位置,length函数,MD5函数计算输入字符串的md5值(常用作新加的主键),substr函数,to_char函数,to_date函数,lastday函数返回月的最后一天,lag窗口函数,row_number窗口函数计算行号从1开始,还有常用聚合函数等

其它细微的区别用法详见官方文档。


MaxCompute SQL


1.MaxCompute SQL中用到哪些优化?

首先优化SQL的过程,实际上就是要尽可能减少IO读取,尽可能减少计算资源的使用,尽可能减少SQL复杂度,尽可能提升运行速度。

(1)建分区表,但建议分区层数不超过3层,后续查询时为了避免全表扫描需要分区裁剪,分区值尽量常量化,避免不可确定值;插入数据时尽量采用写入静态分区的方式,优化数据存储,提高运行效率;如果用动态分区,底层来说会生成较多的小文件和多个mapreduce任务,增加系统负担。

(2)只select有效列,并用limit限制返回的条数。考虑这两种情况:(1)有些事实表的字段很多,多到有四五十个字段,这种表实际是可能存在的,比如企业报税的申报表,那么select * from整张表的所有字段时,数据量一大就会消耗更多查询时间;(2)第二种情况是假设事实表中存有某个复杂格式的字段,比如json格式,那么在select * from时也会耗时严重,因此select有效列是较好的习惯。

(3)mapjoin优化,mapjoin的原理简单说就是先将小表加载到内存中,后续大表与内存中的小表直接计算(底层是大表与内存中的小表的计算在map阶段直接完成,避免了reduce阶段的计算耗时)

(4)避免一些消耗资源的操作,比如:

少用distinct,容易触发数据倾斜

count(distinct)处理的时间会很长可以转换成count()+ group by。因为如果原先只用count(distinct)来处理表的数据,只会开启一个reduce任务来完成所有的计算,而改成count/sum + group by后,除了count/sum会开启一个reduce计算之外,group by也会单独开启另一个reduce来计算,因此数据量大时可以明显提升查询速度。

尽量避免Order by,order by会触发全局排序,只能单点运行,效率低,如果业务允许,可以改成distribute by + sort by

将full outer join 改为left outer join + union all 并对小表使用上mapjoin。

多个表join时,join顺序很重要,优先选择join结果输出小的表先关联,能有效减少中间数据量,节省IO和计算资源。

读取相同源表时可以合并成一条sql,系统会优化只读取一次。

(5)尽量使用内置的UDF函数和窗口函数,内置UDF在实现时做了很多优化,运行快,省资源,窗口函数本身能处理很多复杂问题。

(6)尽可能保证表达式两边的数据类型一致,如果发生隐式转换容易造成精度问题,比如string和bigint都转成double来相等比较,悲观情况下,可能触发数据倾斜。这时要cast显式转换一下

工作中还用到的:

- 数据量达到千万级别的,尽量固化分区,不在查询sql里面进行动态分区,减少资源使用

- sql行数较长的,尽量拆分成工作流任务,可以优化性能和排查问题的难易度。

- 维度表要放到mapjoin里,加大资源利用率

- 数据倾斜较高的表,先落地成临时表

- 每日全量推送任务的,如果表级数据量较高的,分析是否可以改成增量模式。

2.MaxCompute SQL介绍以及与通用数据库的区别?

MaxCompute SQL适用于海量数据,实时性要求不高的场合,MaxCompute 作业提交后会有几十秒到数分钟不等的排队调度;采用的是类似与SQL的语法,可以看作是标准SQL的子集,但也有不同点,比如没有事务,主键约束,索引等。

有Bigint,double,String,datetime,Boolean,decimal类型。

可以设置分区表,还可以给表指定生命周期LifeCycle。


具体区别如下:

1.MaxCompute表不⽀持主键、索引和字段约束;

2.最明显的区别是,MaxCompute表不⽀持UPDATE语句和DELECT语句(不支持更新操作),只能DROP 整个表或者某一分区数据,然后用INSERT OVERWRITE/INSERT INTO写入数据。

3.MaxCompute表创建表时不允许指定默认值,可以指定生命周期,周期结束后自动清楚数据;

4.SELECT语句输出的数据⾏数是受限制的,最⼤为10000条;

5.MaxCompute 不支持MINUS差集操作,如果需要做差集操作可以用LEFT OUTER JOIN 然后取右表关联为空的数据。MaxCompute的where子句也不支持between条件查询。

6.MaxCompute把sql的关键子做为保留字,对列,表或是分区命名时不能直接使用保留字作命名。

7.插入语句有insert into | overwrite into,overwrite into写入前会清空表数据;

8.可以直接在select中使用mapjoin,所有小表占用的内存总和不得超过512MB,在官方文档中说mapjoin最多支持6张小表,但工作中我们是规定不能超过8张小表,因为有些表真的容量不大。

9.MaxCompute SQL不支持顶级的两个查询结果合并,要改写为一个子查询的形式,也就是一个union all连接的语句,外面必须套一层select * from加别名。

10.MaxCompute也有内置函数,和大部分数据库的用法差不多,如果忘记可以直接查看官方文档或者MaxCompute的IDE也可以直接搜索。

MaxCompute常用到的函数:dateadd函数对日期加减法,datediff计算两个日期差值,getdate获取系统日期,cast转换目标数据类型, coalesce函数返回列表中第一个非空的值,case when;decode实现if-then-else分支选择的功能,concat连接所有字符串,instr函数计算子串在字符串中的位置,length函数,MD5函数计算输入字符串的md5值(常用作新加的主键),substr函数,to_char函数,to_date函数,lastday函数返回月的最后一天,lag窗口函数,row_number窗口函数计算行号从1开始,还有常用聚合函数等

其它细微的区别用法详见官方文档。

3.MaxCompute的其他细节:

MaxCompute不支持删除列的。

参与Union All运算的所有列的数据类型和列个数、名称必须完全一致。

数据类型只能是bigint、double、boolean、datetime和string;

lifecycle建表时指明此表的生命周期,但create table like时并不会复制源表的生命周期;

create table … as select …语句创建的表不会复制分区属性,而是把源表的分区键作为目标表的一般列处理;如果希望和源表有相同表结构,建议使用create table … like …,然后再手动插入数据。

对于设置了生命周期的表,如果是非分区表,那么会从最后一次被修改的时间开始计算周期,周期时间到将会被MaxCompute自动回收,如果有数据更新,那么周期会重新刷新时间;如果是分区表,则细分到某个分区是否有被改动过,回收也只是针对某一个长时间为改动过的分区数据。

删除分区:ALTER TABLE … DROP [IF NOT EXISTS] PARTITION …;

添加列:ALTER TABLE … ADD COLUMNS();

修改列名:ALTER TABLE … CHANGE COLUMN…RENAME TO …

修改分区值:ALTER TABLE … PARTITION(分区=分区值) RENAME TO PARTITION(分区=分区值);

修改表的注释:ALTER TABLE…SET COMMENT ‘’;

修改表的生命周期:ALTER TABLE …SET LIFECYCLE = ‘’;

清空非分区表的数据:TRUNCATE TABLE ;如果是分区表,需要ALTER TABLE … DROP PARTITION先删除分区数据再TRUNCATE

修改列、分区的注释:ALTER TABLE … CHANGE COLUMN 列名 COMMENT ‘’;

4.MaxCompute中的类型转换

MaxCompute中支持显示转换cast和隐式转换。

对于显示转换过程中,会发生如下问题:

cast将double类型转换成bigint类型时,小数部分会被截断;

满足double类型的string类型转为bigint类型时,会先将string转为double,然后再转为bigint,期间小数部分也会被截断。

String类型和Datetime类型之间的转换

MaxCompute支持两者的相互转换,但有一个注意点是各个单位的值域中,如果首位为0是不能忽略的,比如:cast(‘2020-1-1 12:12:!2’ as datatime)中的一月份没有写0就会报错。

由于double存在精度差,所以不能直接对两个double类型的数值用=号判断相等,可以在相减后取绝对值的方式判断,当绝对值足够小时可以说明两数相等。

abs(0.9999999999 - 1.0000000000) < 0.000000001

String类型在参与运算前会进行隐式类型转换到double类型

bigint和double类型在计算时,bigint会隐式转换为double再计算,返回结果也是double

位运算符不支持隐式转换,同时只允许bigint类型。逻辑运算符也不支持隐式转换,只允许boolean类型。

5.MaxCompute中的mapjoin使用限制

left outer join的左表必须是大表;right outer join的右表必须是大表,inner join左右都可以是大表,full outer join不能使用mapjoin

mapjoin支持小表为子查询,使用mapjoin需要引用小表或者子查询时,需要引用别名

在mapjoin中,可以使用不等值连接或者使用or连接多个条件

最多指定8张小表(看新旧版本),所有小表占用的内存总和不能超过512M,否则报语法错误。

多个表join时,最左边的两张表不能同时时mapjoin的表。

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
4月前
|
JavaScript 大数据 Python
原生大数据|elasticSearch|低版本kibana组件的汉化
原生大数据|elasticSearch|低版本kibana组件的汉化
29 0
|
4月前
|
监控 物联网 大数据
助力工业物联网,工业大数据之服务域:AirFlow的架构组件【三十二】
助力工业物联网,工业大数据之服务域:AirFlow的架构组件【三十二】
49 0
|
4月前
|
大数据 Java 分布式数据库
使用记忆法打造你的大数据组件的默认端口号记忆宫殿
使用记忆法打造你的大数据组件的默认端口号记忆宫殿
30 0
|
4月前
|
大数据
大数据组件的默认端口号思维导图
大数据组件的默认端口号思维导图
25 0
|
4月前
|
SQL 分布式计算 Hadoop
假如大数据组件中的动物都变成神奇宝贝,那会变成什么样?
假如大数据组件中的动物都变成神奇宝贝,那会变成什么样?
26 1
|
4月前
|
Ubuntu 大数据 Linux
【大数据组件】一篇文章让你快速入门Docker
【大数据组件】一篇文章让你快速入门Docker
39 0
|
4月前
|
SQL 分布式计算 Hadoop
假如大数据组件中的动物都变成神奇宝贝,那会变成什么样?(大数据的组件动漫化)
假如大数据组件中的动物都变成神奇宝贝,那会变成什么样?(大数据的组件动漫化)
42 1
|
4月前
|
存储 缓存 NoSQL
大数据 | HDFS 元数据持久化笔记
大数据 | HDFS 元数据持久化笔记
54 0
|
4月前
|
存储 分布式计算 大数据
大数据笔记 | HDFS 常用操作命令
大数据笔记 | HDFS 常用操作命令
114 0
|
4月前
|
大数据 Linux 网络安全
大数据笔记 | 无密钥登录操作步骤
大数据笔记 | 无密钥登录操作步骤
43 0

热门文章

最新文章