MaxCompute SQL 与 Hive 对比分析及使用注意事项 | 学习笔记

本文涉及的产品
对象存储 OSS,20GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
对象存储 OSS,内容安全 1000次 1年
简介: 快速学习 MaxCompute SQL与 Hive 对比分析及使用注意事项

开发者学堂课程【SaaS 模式云数据仓库系列课程 —— 2021数仓必修课MaxCompute SQL 与 Hive 对比分析及使用注意事项】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/55/detail/1051


MaxCompute SQL 与  Hive  对比分析及使用注意事项


内容简介:

一、MaxCompute  和 Hive  对比内容介绍

二、MaxCompute  介绍

三、MaxCompute  和Hive  对比

四、注意事项

一、MaxCompute  和  Hive  对比内容介绍

对比内容

对比内容

MaxCompute  Hive

文件系统

 

调度系统

 

客户端

 

SQL对比

建表语句

分区分桶

数据上传下载

外部表

SQL函数

UDF

MapReduce

SQL调优

文件格式


Web UI

 

界面话操作

 

权限


二、MaxCompute  介绍

MaxCompute  主要服务于批量结构化数据的存储和计算,可以提供海量数据仓库的解决方案以及针对大数据的分析建模服务。

基于  MaxCompute的  Serverless  无服务器的设计思路,用户只需关心作业和数据,而无需关心底层分布式架构及运维。


三、MaxCompute   和  Hive 对比

1、文件系统对比

 

MaxCompute

Hive

文件系统

MaxCompute的数据是在飞天文件系统,对外不暴露文件系统,底层优化会自动做好.

Hive的数据实际上是在HDFS上,元数据一般放在MySql,以表的形式展现。可以直接到HDFS上查到具体文件.


飞天(Apsara )是由阿里云自主研发、服务全球的超大规模通用计算操作系统。

2、客户端对比

(1)Hive   客户端:

[rooteemr-header-1~]# hive

Hive Session ID-b005c924-1127-48bc-bb5-8ef546564898

Logging initialized using configuration in file:/etc/ecam/hive-conf-3.1.1-1.1.6/hive-log4j2.properties Async: true

Hive Session ID 25ecee88-fceb-44ea-a38f-4b98f94fe6c1

Hive-on-HR is deprecated in Hive 2 cnd may not be available in the future versions.Corsider using a different execution engine (i.e. spark,tez) or using Hive 1.X re es.

hive show databeses;

OK

28/02/05 88:57:05 INFO Configuration.deprecation:mcpred.input.dir is deprecated.Instecduse mapreduce.irput.fileinputformat.irputdir

20/02/0588:57:05 INFO 1zo.GPLNativeCodeLoader:Looded native gpl library from the erbedded bincries

20/02/05 08:57:85 INFO Lzo.LzoCodec: Successfully looded & initialized rative-Lzo library Dredoop-1zo rev 97184efe294f64651c4c5c17Zcbx221461036053]

20/02/0508:57:05 INFO mapred.FileIrputFornat:Total irput files to process:1

default

extra_demo

git_database

mno_deno_wei

mmo_demo_zyj

mma_hive

par_deno

Time taken: 0.936

(2)MaxCompute  客户端:

Last login: Wed Feb 5 09:01:02 on ttys004

/Users/1jw/Desktop/odpscmd_public/bin/odpscmd;exit;

-bash:export:'CLASSPATH#': not a valid identifier

-bash:export:‘2019.10': not a valid identifier

(base)IT-CO2NG62KG5RN:~ ljw$ /Users/1jw/Desktop/odpscmd_public/bin/odpscmd ; exit;

/_/

Aliyun ODPS Command Line Tool

Version 0.32.1-public

@Copyright 2019 Alibaba Cloud Computing Co., Ltd. Al1 rights reserved.

Connectingto

http://service.cn-hangzhou.maxcompute.aliyun.com/api,project:WB_BestPractice_devProject timezone:Asia/Kolkata

Connected!

odoso WB BestPractice dev>

项目空间 (Project)  是  MaxCompute  的基本组织单元,它类似于传统数据库的Database  或  Schema  的概念,是进行多用户隔离和访问控制的主要边界。一个用户可以同时拥有多个项目空间的权限。通过安全授权,可以在一个项目空间中访问另一个项目空间中的对象,例如表(Table)、资源(Resource)、函数(Function)、和实例  Instance  。

MaxCompute  除了命令行客户端也提供了  Python  和  Java  的  SDK  来访问。

MaxCompute SDK  的入口,可通过此类来获取项目空间下的所有对象集合,包括Projects、Tables、Resources、Functions、Instances。

可以通过传入  Aliyu Account  实例来构造  MaxCompute  对象。程序示例如下。

Account account = new AliyunAccount("my_access_id", "my_access_key");

Odps odps = new Odps(account);

String odpsUrl="";

odps.setEndpoint(odpsUrl);

odps.setDefaultProject("my_project");

for (Table t: odps.tables())(

MaxCompute Tunnel  数据通道是基于  Tunnel SDK  编写的。可以通过  Tunnel  向  MaxCompute  中上传或者下载数据

SQLTask

SQLTask  是用于运行、处理  SQL  任务的接口。可以通过运行接口直接运行  SQL。注意:每次只能提交运行一个  SQL  语句,脚本模式可以一次提交多个SQL。

运行接口返回  Instance  实例,通过  Instance  获取  SQL 的运行状态及运行结果。程序示例如下。

import java.util.List;

import com.aliyun.odps.Instance;

import com.aliyun.odps.Odps;

import com.aliyun.odps.OdpsException;

import com.aliyun.odps.account.Account;

import com.aliyun.odps.account.AliyunAccount;

import com.aliyun.odps.data.Record;

import com.aliyun.odps.task.SQLTask;

public class testsql(

private static final String accessId

private static final String accessKey

private static final String endPoint "http://service.odps.aliyun.com/api" private static final String project

private static final String sql = "select category from iris;";

public static void

main(String[】 args)(

Account account = new AliyunAccount(accessId, accessKey);

0dpsodps = newOdps(account); )

odps.setEndpoint(endPoint);

odps.setDefaultProject(project);

Instance i;

try(

i = SQLTask.run(odps,sql);

i.waitForSuccess();

List records SQLTask.getResult(i); for(Record r:records)

System.out.println(r.get(0).toString());

catch (OdpsException e) (

e.printStack7race();2

3、Hive SQL和MaxCompute SQL对比

⑴建表语句


MaxCompute

Hive

建表语句

create table t1id

int comment 'lD',name string comment '名称',hobby string comment '爱好',add1 map<string, string>

partitioned by (ds string comment '当前时间,用于分区字段');

Create table t1(

idint,namestring,hobby array<string>,addmap<String,string>

row format delimitedfields terminated by ";collection items terminated by '-'map keys terminated by ":"


MaxCompute  建表不需要指定分隔符,指定文件存储路径,指定文件的存储格式。

MaxCompute  是基于阿里云飞天文件系统,用户无需关心文件存储格式,压缩格式,存储路径等,这些操作由阿里云来完成,用户也不用来疲于文件存储成本,压缩性价比,读写速度等优化,可以将精力集中在业务的开发上。

(2)数据的上传下载对比

MaxCompute

Hive

数据上传和

下载

MaxCompute是通过命令工具tunnel上

传下载。

Hive是通过命令上传数据

load data [local] inpath '

/opt/module/datas/test.txt’[overwrite] into

table test

Upload:

上传数据到  MaxCompute  的表中。支持文件或目录(指一级目录)的上传,每一次上传只支持数据上传到一张表或表的一个分区。分区表一定要指定上传的分区,多级分区一定要指定到末级分区。

将log.txt中的数据上传至项目空间  test_project  的表  test_table(二级分区表)中的p1="b1",p2="b2"分区。tunnel upload log.txt test_project.test_table/p1="b1",p2="b2";

Download:

从  MaxCompute  的表中下载数据。只支持下载到单个文件,每一次下载只支持下载一张表或一个分区到一个文件。分区表一定要指定下载的分区,多级分区一定要指定到未级分区。

将  test_project.test_table  表(二级分区表)中的数据下载到  test_table.txt  文件中。

tunnel downloadtest_project.test_table/p1="b1",p2="b2"test_table.txt;

(3)分区和分桶对比

MaxCompute

Hive

分区

分区用法一致

分区用法一致

分桶

实际上分桶是把一个大文件根据某个字段hash成多个小文件,适当的分桶会提高查询效率,在MaxCompute中这些优化底层已经做了。可以在建表时通过指定clustered by中的Hash Key。MaxCompute将对指定列进行Hash运算,按照Hash值分散到各个Bucket中。为避免数据倾斜和热点,取得较好的并行执行效果,clustered by列适宜选择取值范围大,重复键值少的列。此外,为了达到join优化的目的,也应该考虑选取常用的Join/Aggregation Key,即类似于传统数据库中的主键。

执行命令hive.enforce.bucketiong=true;使用关键字clustered by指定分区依据的列名,还要指定分为多少桶

create table test(id int,name string)clusteredby(id) into 3 buckets row format delimited fieldsterminated by "it

(4)外部表对比

MaxCompute

Hive

外部表功能MaxCompute2.0中也是同样支持的,MaxCompute通过外部表来映射阿里云的OTS和OSS两个数据存储产品来处理非结构化的数据,例如音频视频等。

Hive可以通过外部表的功能来操作例如Hbase和ES的数据。


MaxCompute非结构化数据框架通过External Table与各种数据的关联,关联OSS上开源格式数据的ExternalTable建表的DDL语句格式如下所示。

DROP TABLE[IF EXISTS] ;

CREATE EXTERNAL TABLE [IF NOT EXISTS]

()

[PARTITIONED BY(partition column schemas)】【ROW FORMAT SERDE ''

[WITHSERDEPROPERTIES ('odps.properties,rolearn'='$(roleran]'[,name2'='value2',..])]

STORED AS

LOCATION'oss://$tendpoint]/$(bucketY/$(userfilePath]/';

该语法格式与  Hive  的语法接近,但需注意以下问题:

column schemas  :外部表的  column schemas  必须与具体 OSS  上存储的数据的schema相符合。

ROW FORMAT SERDE:非必选选项,只有在使用一些特殊的格式(例如TEXTFILE)时才需要使用。WITH SERDEPROPERTIES:  当关联  OSS  权限使用  STS  模式授权时,需要该参数指定  odps.properties.rolearn  属性,属性值为  RAM  中具体使用的  Role  的  Arn  的信息。您可以在配置  STORED AS 的同时也通过说明  fileformat  文件格式。

如果不使用  STS  模式授权,则无需指定  odps.properties.rolearn  属性,直接在Location  传入明文  AccessKeyld  和  AccessKeySecret

授权方式有两种:

(1)当  MaxCompute  和  OSS  的  Owner  是同一个账号时,可以直接登录阿里云账号后,单击一键授权。在访问控制给改子账号添加管理对象存储服务  (OSS)  权限  (AliyunOSSFullAccess)。

https://help.aliyun.com/document_detail/72777.html?spm=a2c4g.11174283.6.772.559b590eFt4rNd

(2)自定义授权

a.新增一个  RAM  角色  oss-admin

b.修改角色策略内容设置

c.授予角色访问  OSS  必要的权限  AliyunODPSRolePolicy

d.将权限  AliyunODPSRolePolicy  授权给该角色。

(5)自定义函数对比

MaxCompute

Hive

自定义函数

MaxCompute支持自定函数,udf,udtf,udaf

Hive支持自定函数, udf,udtf,udaf


MaxCompute 2.0  版本升级后,Java UDF  支持的数据类型从原来的  BIGINT、STRING、DOUBLE.

BOOLEAN  扩展了更多基本的数据类型,同时还扩展支持了  ARRAY、MAP、STRUCT以及Writable   等复杂类型

使用复杂数据类型的方法,STRUCT对应com.aliyun.odps.data.Struct。com.aliyun.odps.data.Struct  从反射看不出   Field Name  和  Field Type  ,所以需要用  @Resolve  注解来辅助。即如果需要在  UDF  中使用  STRUCT,要求在UDFClass  上也标注上  @Resolve  注解。但是当我们  Struct  类型中的  field  有很多字段的时候,这个时候需要我们去手动的添加  @Resolve  注解就不是那么的友好。

针对这一个问题,我们可以使用  Hive 中的  GenericUDF  去实现。MaxCompute 2.0支持  Hive  风格的  UDF,部分  HiveUDF、UDTF  可以直接在  MaxCompute上使用。

(6) MapReduce  开发

MaxCompute

Hive

MapReduce

MaxCompute提供三个版本的MapReduce编程接口∶ MaxCompute MapReduce、MapReduce(MR2)、Hadoop兼容版本MapReduce

MapReduce是一个基于集群的计算平台,是-个简化分布式编程的计算框架,是一个将分布式计算抽象为Map和Reduce两个阶段的编程模型。

MaxCompute MapReduce : MaxCompute的原生接口,执行速度更快、开发更便捷、不暴露文件系统。

MaxCompute  扩展  MapReduce ( MR2) :对  MaxCompute MapReduce  的扩展,支持更复杂的作业调度逻辑。MapReduce  的实现方式与  MaxCompute  原生接口一致。

Hadoop  兼容版本  MapReduce  ∶高度兼容  Hadoop MapReduce,与MaxCompute MapReduce MR2  不兼容。

(7)Sql  优化

MaxCompute

Hive

Sql优化

key分布不均匀,数据倾斜,join长尾,窗口函数

key分布不均匀,数据倾斜,join长尾,窗口函数

4、WebUI  对比

WebuI

MaxCompute  中使用  Logview查看 Job 信息。通过  Logview  可看到一个 Job 的如下内容∶

Hive  任务依赖于 Hadoop的HDFS和yarn提供的WebUI  访

任务的运行状态。

任务的运行结果。

任务的细节和每个步骤的进度。

Job  提交到  MaxCompute  后,会生成

Logview  的链接。可以直接在浏览器上打开  Logview  链接,进入查看 Job  的信息。


Logview  的首页分成上下两部分  :Instance  信息

Task  信息

Instance  信息

在  Logview  页面中,上半部分是您提交的  SQL  任务对应的  MaxCompute Instance  信息,包含URL链接、项目、

InstancelD、提交人、开始时间、结束时间和状态( Status )等。Instance信息部分,您可以单击  Status  查看当前队列的  Status  详细信息,包含四种状态:

Waiting   :说明当前作业正在   MaxCompute   中处理,并没有提交到分布式调度系统( Fuxi )中运行。

Waiting List : n :说明作业已提交至分布式调度系统( Fuxi )排队等待运行,当前在队列中处于第n位。

Running   :作业在分布式调度系统( Fuxi )中运行。

5、界面话操作

 

MaxCompute

Hive

阿里云的产品基本上都是界面化操作,可拖拽等等,开发门槛非常低,所以也是非常适合初学大数据或者公司没有相关开发人力的公司。

hive可以借助hue工具来操作查询数据,但是实际上交互性不是很强。

Maxcompute  的界面化操作可以结合  Dataworks  做数据同步,权限控制,数据管理和其他数据源交互,定时调度等。

6、权限操作

MaxCompute

Hive

权限操作

ACL+Policy

ACL



四、注意事项

1、Java   沙箱限制

MaxCompute MapReduce 及  UDF  程序在分布式环境中运行时,受到  Java   沙箱的限制  (MapReduce  作业的主程序,例如MR Main则不受此限制),具体限制如下所示。

不允许直接访问本地文件,只能通过   MaxCompute MapReduce/Graph  提供的接口间接访问。

读取  resources  选项指定的资源,包括文件、Jar  包和资源表等。

通过 System.out  和  System.err   输出日志信息,可以通过 MaxCompute  客户端的Log  命令查看日志信息。不允许直接访问分布式文件系统,只能通过MaxCompute MapReduce/Graph   访问到表的记录。

不允许JNI调用限制。

不允许创建  Java  线程,不允许启动子进程执行  Linux  命令。

Java  反射限制:suppressAccessChecks  权限被禁止,无法  setAccessible  某个private  的属性或方法,以达到读取  private  属性或调用  private  方法的目的。

2、Sql  使用权限

参照数值

3、MaxCompute  数据操作

MaxCompute  不支持直接对表数据删除  (Delete)  和更新  (Update)  的语法。

更新( Update)数据只能把源分区或表数据导入到新分区或表(新分区或表可以与源分区或表相同),在导入过程中执行相应的更新逻辑。

对于非分区列,只支持重命名和新建列,不支持对列的删除。

MaxCompute  不支持  Update  语句,建议把更新后的结果筛选出来,然后用Insert Overwrite   的方法写回原表。

删除  (Delete)  的数据可以通过删除  (Drop)  表达到数据删除目的。

非分区表可以通过  TRUNCATE TABLE table_name;  语句清空表数据。

分区表可以通过

ALTER TABLE table_name DROP IF EXISTS PARTITION   (分区名=‘具体分区值)删除分区达到删除整个分区数据的目的。

通过INSERT和WHERE条件把需要的数据导入到另一张新分区或表中或就地更新,INSERT语句支持源表和目的表是同一张表。

4、MaxCompute  单字段大于  8MB  的限制

处理思路:目前由于存储机制限制,MaxCompute  表 中单个字段(多为  String  字段)的最大长度不能超过  8MB。对于超过  8MB的超大字段,建议拆分成多个字段。具体的拆分逻辑可以根据业务特性设计,保证每个字段不超过  8MB  即可。

常用方法:由于复杂结构的超大字段在数据开发和分析中会严重影响计算性能,因此建议根据数仓建设规范来设计您的数据架构,避免超大字段:

具有复杂结构的原始数据,作为  ODS  层,最好以压缩的方式归档。

定时(例如每天)对  ODS 层的增量数据做数据清洗,复杂字段拆分为多个简单字段,然后存储在  CDM  层的表中,便于数据的统计分析。

5、设置兼容  Flag

说明 默认模式是  MaxCompute  模式,如果要切换至  Hive  模式,需要开启odps.sql.hive.compatible为True。--Project  级别切换为  Hive  模式。

setproject odps.sql.hive.compatible=True;

Session

级别切换为  Hive  模式。

set odps.sql.hive.compatible=True;

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
11天前
|
SQL 存储 算法
比 SQL 快出数量级的大数据计算技术
SQL 是大数据计算中最常用的工具,但在实际应用中,SQL 经常跑得很慢,浪费大量硬件资源。例如,某银行的反洗钱计算在 11 节点的 Vertica 集群上跑了 1.5 小时,而用 SPL 重写后,单机只需 26 秒。类似地,电商漏斗运算和时空碰撞任务在使用 SPL 后,性能也大幅提升。这是因为 SQL 无法写出低复杂度的算法,而 SPL 提供了更强大的数据类型和基础运算,能够实现高效计算。
|
1月前
|
SQL 分布式计算 Hadoop
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
Hadoop-12-Hive 基本介绍 下载安装配置 MariaDB安装 3台云服务Hadoop集群 架构图 对比SQL HQL
60 3
|
1月前
|
SQL 分布式计算 Hadoop
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
45 2
|
1月前
|
SQL 消息中间件 分布式计算
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(一)
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(一)
75 0
|
1月前
|
SQL 大数据
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(二)
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(二)
58 0
|
1月前
|
SQL 大数据 API
大数据-132 - Flink SQL 基本介绍 与 HelloWorld案例
大数据-132 - Flink SQL 基本介绍 与 HelloWorld案例
45 0
|
1月前
|
SQL 分布式计算 大数据
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
44 0
|
1月前
|
SQL 分布式计算 算法
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(二)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(二)
78 0
|
1月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
36 0
|
1月前
|
SQL 分布式计算 大数据
大数据-94 Spark 集群 SQL DataFrame & DataSet & RDD 创建与相互转换 SparkSQL
大数据-94 Spark 集群 SQL DataFrame & DataSet & RDD 创建与相互转换 SparkSQL
54 0