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

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 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;

相关实践学习
简单用户画像分析
本场景主要介绍基于海量日志数据进行简单用户画像分析为背景,如何通过使用DataWorks完成数据采集 、加工数据、配置数据质量监控和数据可视化展现等任务。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
21天前
|
存储 消息中间件 监控
【Flume】Flume在大数据分析领域的应用
【4月更文挑战第4天】【Flume】Flume在大数据分析领域的应用
|
1月前
|
Cloud Native 数据处理 云计算
探索云原生技术在大数据分析中的应用
随着云计算技术的不断发展,云原生架构作为一种全新的软件开发和部署模式,正逐渐引起企业的广泛关注。本文将探讨云原生技术在大数据分析领域的应用,介绍其优势与挑战,并探讨如何利用云原生技术提升大数据分析的效率和可靠性。
|
1月前
|
存储 消息中间件 大数据
Go语言在大数据处理中的实际应用与案例分析
【2月更文挑战第22天】本文深入探讨了Go语言在大数据处理中的实际应用,通过案例分析展示了Go语言在处理大数据时的优势和实践效果。文章首先介绍了大数据处理的挑战与需求,然后详细分析了Go语言在大数据处理中的适用性和核心技术,最后通过具体案例展示了Go语言在大数据处理中的实际应用。
|
1月前
|
数据采集 运维 数据挖掘
API电商接口大数据分析与数据挖掘 (商品详情店铺)
API接口、数据分析以及数据挖掘在商品详情和店铺相关的应用中,各自扮演着重要的角色。以下是关于它们各自的功能以及如何在商品详情和店铺分析中协同工作的简要说明。
|
3天前
|
SQL 分布式计算 资源调度
一文解析 ODPS SQL 任务优化方法原理
本文重点尝试从ODPS SQL的逻辑执行计划和Logview中的执行计划出发,分析日常数据研发过程中各种优化方法背后的原理,覆盖了部分调优方法的分析,从知道怎么优化,到为什么这样优化,以及还能怎样优化。
|
15天前
|
机器学习/深度学习 人工智能 安全
Azure Databricks实战:在云上轻松进行大数据分析与AI开发
【4月更文挑战第8天】Databricks在大数据分析和AI开发中表现出色,简化流程并提高效率。文中列举了三个应用场景:数据湖分析、实时流处理和AI机器学习,并阐述了Databricks的一体化平台、云原生弹性及企业级安全优势。博主认为,Databricks提升了研发效能,无缝集成Azure生态,并具有持续创新潜力,是应对大数据挑战和加速AI创新的理想工具。
39 0
|
15天前
|
SQL 分布式计算 Hadoop
利用Hive与Hadoop构建大数据仓库:从零到一
【4月更文挑战第7天】本文介绍了如何使用Apache Hive与Hadoop构建大数据仓库。Hadoop的HDFS和YARN提供分布式存储和资源管理,而Hive作为基于Hadoop的数据仓库系统,通过HiveQL简化大数据查询。构建过程包括设置Hadoop集群、安装配置Hive、数据导入与管理、查询分析以及ETL与调度。大数据仓库的应用场景包括海量数据存储、离线分析、数据服务化和数据湖构建,为企业决策和创新提供支持。
56 1
|
16天前
|
SQL 数据库 索引
SQL索引失效原因分析与解决方案
SQL索引失效原因分析与解决方案
22 0
|
24天前
|
SQL 关系型数据库 MySQL
【MySQL】慢SQL分析流程
【4月更文挑战第1天】【MySQL】慢SQL分析流程
|
28天前
|
机器学习/深度学习 人工智能 数据可视化
基于Python的数据可视化技术在大数据分析中的应用
传统的大数据分析往往注重数据处理和计算,然而数据可视化作为一种重要的技术手段,在大数据分析中扮演着至关重要的角色。本文将介绍如何利用Python语言中丰富的数据可视化工具,结合大数据分析,实现更直观、高效的数据展示与分析。