1. 程式人生 > 其它 >RedShift到MaxCompute遷移實踐指導

RedShift到MaxCompute遷移實踐指導

簡介:本文主要介紹Amazon Redshift如何遷移到MaxCompute,主要從語法對比和資料遷移兩方面介紹,由於Amazon Redshift和MaxCompute存在語法差異,這篇文章講解了一下語法差異

1.概要

本文件詳細介紹了Redshift和MaxCompute之間SQL語法的異同。這篇文件有助於加快sql任務遷移到MaxCompute。由於Redshift和MaxCompute之間語法存在很多差異,因此我們需要修改Redshift上編寫的指令碼,然後才能在MaxCompute中使用,因為服務之間的SQL方言不同。

2.遷移前RedShift於MaxCompute的各項對比差異

2.1.1資料型別對比及型別轉化

類別

MaxCompute

建議轉化成MaxCompute型別

Redshift

數值型別

smallint

Y

Y

Y

integer

N

int

Y

bigint

Y

int

Y

decimal

Y

Y

Y

numeric

N

decimal

Y

real

N

float

Y

double

Y

Y

Y

float

Y

float

Y

TINYINT

Y

smallint

N

字元型別

varchar(n)

Y

Y

Y

char(n)

Y

Y

Y

STRING

Y

text

N

string

Y

日期

TIMESTAMP

Y

Y

Y

TIMESTAMPTZ

N

Y

DATE

Y

Y

Y

TIME

N

Y

DateTime

Y

N

boolean 資料型別

boolean

Y

Y

Y

複雜資料型別

ARRAY

Y

Y

N

MAP

Y

Y

N

STRUCT

Y

Y

N

HLLSketch

N

Y

MaxCompoute資料型別參考https://help.aliyun.com/document_detail/159541.html

2.1.2語法對比

MaxCompute沒有schenma、group、庫、儲存過程的概念。只有project、表、分割槽,MaxCompute建表時沒有自增序列 外來鍵等,不支援指定編碼預設utf-8,內部表不支援指定儲存格式預設Aliorc

主要區別

表結構

不能修改分割槽列列名,只能修改分割槽列對應的值。

支援增加列,但是不支援刪除列以及修改列的資料類

型。

SQL 常見問題

INSERT 語法上最直觀的區別是:Insert into/overwrite 後面

有個關鍵字 Table。

資料插入表的欄位對映不是根據 Select 的別名做的,而

是根據 Select 的欄位的順序和表裡的欄位的順序

UPDATE/DELETE

只有事務表支援UPDATE/DELETE

join

Join 必須要用 on 設定關聯條件,不支援笛卡爾積

觸發器

不支援觸發器、

建立外部函式

maxCompute沒有外部函式

精度

DOUBLE 型別存在精度問題。 不建議在關聯時候進行直接等號關聯兩

個 DOUBLE欄位,建議把兩個數做減

法,如果差距小於一個預設的值就認為

是相同,例如 abs(a1- a2) <

0.000000001。

目前產品上已經支援高精度的型別

DECIMAL。

日期

MaxCompute主要的日期型別是datetime(格式yyyy-mm-dd hh:mi:ss) timestamp date,datetime支援的內建函式更加豐富,建議日期轉成datetime做運算,日期函式連結

儲存過程

使用MaxCompute的pyodps修改

物化檢視

要更新物化化檢視中的資料,MaxCompute只能手動更新,不支援自動更新

redshift 支援在select語句中引用別名如

select money/100 as a ,round(money/100,3) from table

MaxCompute修改

select money/100 as a ,round(a,3) from table

2.1.3複合表示式

MaxCompute

REDAHIFT

+、-

Y

Y

^、|/、||/

Y

Y

*、/、%

Y

Y

@

N

Y

&、|、

Y

Y

||

Y

Y

#、~、<<、>>

使用shift函式替換

Y

2.1.4條件比較

MaxCompute

REDAHIFT

<> 或 !=

Y

Y

like

Y

Y

BETWEENexpressionAND

Y

Y

IS [ NOT ] NULL

Y

Y

EXISTS

Y

Y

POSIX 運算子

N

Y

SIMILAR TO

N

Y

IN

Y

Y

正則 ~

Rlike

Y

~~

like

Y

2.1.5DDL語法

主要差異:

1.MaxCompute不支援主鍵自增和PRIMARY KEY

2.指定預設值default]不支援使用函式

3.decimal指定預設值不支援-1

語法

MaxCompute

REDSHIFT

CREATE TABLE—PRIMARY KEY

N

Y

CREATE TABLE—NOT NULL

Y

Y

CREATE TABLE—CLUSTER BY

Y

N

CREATE TABLE—EXTERNAL TABLE

Y(OSS, OTS, TDDL)

N

CREATE TABLE—TEMPORARY TABLE

N

Y

table_attributes

N(Mc內部表不需要新增屬性)

Y

CREATE TABLE—AS

Y

Y

create materialized view

Y

Y

2.1.6DML語法差異

語法

MaxCompute

REDSHIFT

CTE

Y

Y

SELECT—into

N

Y

SELECT—recursive CTE

N

Y

SELECT—GROUP BY ROLL UP

Y

N

SELECT—GROUPING SET

Y

Y

SELECT—IMPLICT JOIN

Y

Y

SEMI JOIN

Y

N

SELEC TRANSFROM

Y

N

SELECT—corelated subquery

Y

Y

LATERAL VIEW

Y

Y

SET OPERATOR—UNION (disintct)

Y

Y

SET OPERATOR—INTERSECT

Y

Y

SET OPERATOR—MINUS/EXCEPT

Y

Y

INSERT INTO ... VALUES

Y

Y

INSERT INTO (ColumnList)

Y

Y

UPDATE … WHERE

Y(事務表支援)

Y

DELETE … WHERE

Y(事務表支援)

Y

ANALYTIC—reusable WINDOWING CLUSUE

Y

Y

ANALYTIC—CURRENT ROW

Y

Y

ANALYTIC—UNBOUNDED

Y

Y

ANALYTIC—RANGE …

Y

Y

WHILE DO

N

Y

VIEW WITH PARAMETERS

Y

N

select*into

N

Y

2.1.7內建函式對比

其他未列出的redshift函式不支援。

函式型別

MaxCompute

POSTGRESQL

在MaxCompute SQL中是否支援分割槽剪裁

日期函式

ADD_MES

CONVERT_TIMEZONE

DATE_CMP_TIMESTAMP

DATE_CMP_TIMESTAMPTZ

DATE_PART_YEAR

DATE_CMP

INTERVAL_CMP

+

SYSDATE

TIMEOFDAY

TIMESTAMP_CMP

TIMESTAMP_CMP_DATE

TIMESTAMP_CMP_TIMESTAMPTZ

TIMESTAMPTZ_CMP

TIMESTAMPTZ_CMP_DATE

TIMESTAMPTZ_CMP_TIMESTAMP

to_timestamp

TIMEZONE

DATEDIFF

DATEDIFF

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

DATE_ADD

DATEADD

  • MaxCompute模式下:不支援(建議使用DATEADD)。
  • Hive模式下:支援。

DATEPART

date_part

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

DATETRUNC

date_trunc

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

FROM_UNIXTIME

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

GETDATE

CURRENT_DATE

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

ISDATE

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

LASTDAY

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

TO_DATE

TO_DATE

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

TO_CHAR

to_char

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

UNIX_TIMESTAMP

extract

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

WEEKDAY

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

WEEKOFYEAR

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

YEAR

extract

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

QUARTER

EXTRACT

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

MONTH

EXTRACT

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

DAY

EXTRACT

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

DAYOFMONTH

  • MaxCompute模式下:不支援。
  • Hive模式下:支援。

HOUR

EXTRACT

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

MINUTE

EXTRACT

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

CURRENT_TIMESTAMP

CURRENT_TIMESTAMP

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

ADD_MONTHS

運算子+

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

LAST_DAY

LAST_DAY

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

NEXT_DAY

NEXT_DAY

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

MONTHS_BETWEEN

MONTHS_BETWEEN

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

數學函式

exp

ATAN2

DEXP

DLOG1

DLOG10

ABS

ABS

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

ACOS

ACOS

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

ASIN

ASIN

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

ATAN

ATAN

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

CEIL

CEIL

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

CONV

convert

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

COS

COS

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

COSH

ACOS

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

COT

COT

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

EXP

EXP

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

FLOOR

FLOOR

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

LN

LN

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

LOG

LOG

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

POW

power

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

RAND

random

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

ROUND

ROUND

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

SIN

SIN

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

SINH

asin

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

SQRT

SQRT

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

TAN

TAN

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

TANH

atan

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

TRUNC

TRUNC

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

LOG2

LOG

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

LOG10

LOG

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

BIN

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

HEX

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

UNHEX

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

RADIANS

RADIANS

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

DEGREES

DEGREES

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

SIGN

SIGN

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

E

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

PI

PI

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

FACTORIAL

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

CBRT

CBRT

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

SHIFTLEFT

<<

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

SHIFTRIGHT

>>

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

SHIFTRIGHTUNSIGNED

>>>

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

視窗函式

CUME_DIST

FIRST_VALUE/LAST_VALUE

LISTAGG

NTH_VALUE

PERCENTILE_CONT

PERCENTILE_DISC

RATIO_TO_REPORT (ratio_expression) OVER ( [ PARTITION BYpartition_expression] )

STDDEV_SAMP

VAR_SAMP | VARIANCE | VAR_POP

PERCENT_RANK

DENSE_RANK

DENSE_RANK

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

RANK

RANK

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

LAG

LAG

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

LEAD

LEAD

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

PERCENT_RANK

PERCENT_RANK

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

ROW_NUMBER

ROW_NUMBER

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

CLUSTER_SAMPLE

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

NTILE

NTILE

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

聚合函式

PERCENTILE_APPROX

APPROXIMATE PERCENTILE_DISC

LISTAGG

PERCENTILE_CONT

ANY_VALUE

ANY_VALUE

COUNT

COUNT

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

AVG

AVG

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

MAX

MAX

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

MIN

MIN

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

MEDIAN

PERCENTILE_disc

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

STDDEV

STDDEV

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

STDDEV_SAMP

STDDEV_SAMP

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

SUM

SUM

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

WM_CONCAT

string_agg

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

COLLECT_LIST

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

COLLECT_SET

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

VARIANCE/VAR_POP

VARIANCE/VAR_POP

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

VAR_SAMP

VAR_SAMP

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

COVAR_POP

COVAR_POP

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

COVAR_SAMP

COVAR_SAMP

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

PERCENTILE

PERCENTILE_disc

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

字串函式

||

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

BPCHARCMP

BTRIM

CHAR_LENGTH

CHARACTER_LENGTH

CHARINDEX

COLLATE

CRC32

DIFFERENCE

INITCAP

OCTETINDEX

OCTET_LENGTH

QUOTE_IDENT

QUOTE_LITERAL

POSITION

REPEAT

LEFT /RIGHT

STRPOS

STRTOL

CHAR_MATCHCOUNT

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

CHR

CHR

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

CONCAT

CONCAT|array_concat

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

GET_JSON_OBJECT

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

INSTR

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

IS_ENCODING

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

KEYVALUE

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

LENGTH

LENGTH

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

LENGTHB

LEN

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

MD5

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

REGEXP_EXTRACT

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

REGEXP_INSTR

REGEXP_INSTR

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

REGEXP_REPLACE

REGEXP_REPLACE

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

REGEXP_SUBSTR

REGEXP_SUBSTR

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

REGEXP_COUNT

REGEXP_COUNT

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

SPLIT_PART

SPLIT_PART

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

SUBSTR

SUBSTR

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

SUBSTRING

SUBSTRING

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

TOLOWER

LOWER

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

TOUPPER

UPPER

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

TRIM

TRIM

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

LTRIM

LTRIM

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

RTRIM

RTRIM

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

REVERSE

REVERSE

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

REPEAT

REPEAT

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

ASCII

ASCII

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

CONCAT_WS

CONCAT_WS

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

LPAD

LPAD

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

RPAD

RPAD

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

REPLACE

REPLACE

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

SOUNDEX

SOUNDEX

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

SUBSTRING_INDEX

SUBSTRING_INDEX

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

TRANSLATE

TRANSLATE

  • MaxCompute模式下:不支援。
  • Hive模式下:不支援。

URL_DECODE

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

URL_ENCODE

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

CRC32

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

其他函式

CAST

CAST

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

COALESCE

COALESCE

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

DECODE

DECODE

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

GET_IDCARD_AGE

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

GET_IDCARD_BIRTHDAY

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

GET_IDCARD_SEX

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

GREATEST

GREATEST

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

ORDINAL

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

LEAST

LEAST

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

MAX_PT

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

UUID

uuid_generate_v1

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

SAMPLE

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

IF

IF

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

CASE WHEN

CASE WHEN

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

SPLIT

SPLIT

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

STR_TO_MAP

  • MaxCompute模式下:支援。
  • Hive模式下:不支援。

EXPLODE

split_to_array

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

MAP

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

MAP_KEYS

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

MAP_VALUES

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

NVL

NVL

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

ARRAY

ARRAY

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

SIZE

get_array_length

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

ARRAY_CONTAINS

@>

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

POSEXPLODE

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

TRANS_ARRAY

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

INLINE

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

NAMED_STRUCT

  • MaxCompute模式下:支援。
  • Hive模式下:支援。

SUBARRAY

2.1.8 MaxCompute 產品特性

功能

MaxCompute 產品元件

特性介紹

資料儲存

MaxCompute 表 (基於盤古

分散式儲存)

MaxCompute 支援大規模計算儲存,適用於

TB 以上規模的存 儲及計算需求,最大可達 EB

級別。同一個 MaxCompute 項 目支援企業從

創業團隊發展到獨角獸的資料規模需求; 資料

分散式儲存,多副本冗餘,資料儲存對外僅開放

表的 操作介面,不提供檔案系統訪問介面

MaxCompute 支援大規模計算儲存,適用於

TB 以上規模的存 儲及計算需求,最大可達 EB

級別。同一個 MaxCompute 專案支援企業從

創業團隊發展到獨角獸的資料規模需求;

資料分散式儲存,多副本冗餘,資料儲存對外僅

開放表的操作介面,不提供檔案系統訪問介面;

自研資料儲存結構,表資料列式儲存,預設高度

壓縮,後續將提供相容 ORC的Ali-ORC儲存格

式;

支援外表,將儲存在OSS 物件儲存、OTS表格

儲存的資料對映為二維表;

支援Partition、Bucket 的分割槽、分桶儲存;

更底層不是 HDFS,是阿里自研的盤古檔案系

統,但可藉助 HDFS 理解對應的表之下檔案的

體系結構、任務併發機制使用時,儲存與計算解

耦,不需要僅僅為了儲存擴大不必要的計算資

源;

儲存

Pangu

阿里自研分散式儲存服務,類似 HDFS。

MaxCompute 對外目前只暴露表介面,不能直

接訪問檔案系統。

資源排程

Fuxi

阿里自研的資源排程系統,類似 Yarn

資料上傳下載

Tunnel

Streaming Tunnel

不暴露檔案系統,通過 Tunnel 進行批量資料上傳下載

開發&診斷

Dataworks/Studio/Logview

配套的資料同步、作業開發、工作流編排排程、

作業運維及診斷工具。開源社群常見的

Sqoop、Kettle、Ozzie 等實現資料同步和排程

使用者介面

CLT/SDK

統一的命令列工具和 JAVA/PYTHON SDK

SQL

MaxCompute SQL

TPC-DS 100%支援,同時語法高度相容 Hive,

有Hive 背景,開發者直接上手,特別在大資料

規模下效能強大。

* 完全自主開發的 compiler,語言功能開發更

靈活,迭代快,語法語義檢查更加靈活高效

* 基於代價的優化器,更智慧,更強大,更適合

複雜的查詢

* 基於LLVM 的程式碼生成,讓執行過程更高效

* 支援複雜資料型別(array,map,struct)

* 支援Java、Python語言的UDF/UDAF/UDTF

* 語法:Values、CTE、SEMIJOIN、FROM倒

裝、Subquery Operations 、 Set

Operations(UNION /INTERSECT /MINUS)、

SELECT TRANSFORM 、User Defined Type、

GROUPING SET(CUBE/rollup/GROUPING

SET)、指令碼執行模式、引數化檢視

* 支援外表(外部資料來源+StorageHandler,支

持非結構化資料)

Spark

MaxCompute Spark

MaxCompute提供了Spark on MaxCompute

的解決方案,使 MaxCompute 提供相容開源的

Spark 計算服務,讓它在統一的計算資源和資料

集許可權體系之上,提供 Spark 計算框架,支援用

戶以熟悉的開發使用方式提交執行 Spark 作

業。

* 支援原生多版本 Spark 作業:

Spark1.x/Spark2.x作業都可執行;

* 開源系統的使用體驗:Spark-submit 提交方

式,提供原生的 Spark WebUI供使用者檢視;

* 通過訪問OSS、OTS、database 等外部資料

源,實現更復雜的 ETL 處理,支援對 OSS 非結

構化進行處理;

* 使用 Spark 面向 MaxCompute 內外部資料

開展機器學習, 擴充套件應用場景

機器學習

PAI

MaxCompute 內建支援的上百種機器學習算

法,目前 MaxCompute 的機器學習能力由 PAI

產品進行統一提供服務,同時 PAI提供了深度學

習框架、Notebook 開發環境、GPU計算資源、

模型線上部署的彈性預測服務。MaxCompute

的資料對PAI產品無縫整合。

資料接入

目前支撐通過 DTS或者 DataWorks資料整合功能

資料整合是穩定高效、彈性伸縮的資料同步平臺,豐富的異構資料來源之間高速穩定的資料移動及同步能力。支援實時任務和批任務寫入MaxCompute

整體

不是孤立的功能,完整的企業

服務

不需要多元件整合、調優、定製,開箱即用

3、RedShift到MaxCompute遷移工具介紹

從資料庫表匯入到 Amazon S3

https://docs.aws.amazon.com/zh_cn/redshift/latest/dg/c_unloading_data.html?spm=a2c4g.11186623.0.0.50d3358eWX84rm

線上遷移上雲服務

https://help.aliyun.com/document_detail/94352.html

將資料從OSS遷移至同區域的MaxCompute專案load命令

https://help.aliyun.com/document_detail/157418.htm?spm=a2c4g.11186623.0.0.50d3358eWX84rm#concept-2419019

語法校驗工具二選一

MaxCompute studio

https://help.aliyun.com/document_detail/50889.html

DataWorks sql節點

https://help.aliyun.com/document_detail/137510.html

4、遷移整體方案

資料庫遷移主要包含以下內容

遷移實施計劃:

序號

專案

預估時間

1

調研評估

1~2周

2

方案設計

1~2周

3

資源規劃

1周

4

改造與測試驗證

5~7周,需要根據複雜度評估

5

生成割接

1~2周

5、遷移詳細方案

5.1. 現狀分析及需求分析

5.2. 遷移方案設計

使用者根據自身現有 RedShift資料量、QPS、TPS 等效能指標、高可用需求和未來業務增長需求,制定合理化的遷移方案。

5.3. 資源規劃

使用者需要準備好 MaxCompute 的相關環境,同時獲取到對應需要使用的遷移工具。遷移工具的相關內容請參考《 RedShift到MaxCompute遷移工具介紹 》 章節。

5.4. 改造及測試驗證

5.4.1. 改造

遷移工具可以利用MaxCompute studio(或者DataWorks新建sql節點)客戶端語法校驗,新建一個sql檔案,如圖不支援的語法會報紅

MaxCompute Studio安裝文件https://help.aliyun.com/document_detail/50889.html

5.4.1.1. 建表

在RedShift中獲取表列表和表字段定義,按照Maxcompute支援的欄位值進行轉換,對於有update和delete語句的表必須建成Transactional表

型別轉化參考《資料型別對比及型別轉化》章節

建表語法

--建立新表。

create [external] table [if not exists]

[( [not null] [default ] [comment ], ...)]

[comment ]

[partitioned by ( [comment ], ...)]

--用於建立聚簇表時設定表的Shuffle和Sort屬性。

[clustered by | range clustered by ( [, , ...]) [sorted by ( [asc | desc] [, [asc | desc] ...])] into buckets]

--僅限外部表。

[stored by StorageHandler]

--僅限外部表。

[with serdeproperties (options)]

--僅限外部表。

[location ]

--指定表為Transactional表,後續可以對該表執行更新或刪除表資料操作,但是Transactional表有部分使用限制,請根據需求建立。

[tblproperties("transactional"="true")]

[lifecycle ];

--基於已存在的表建立新表並複製資料,但不復制分割槽屬性。

create table [if not exists] [lifecycle ] as ;

--基於已存在的表建立具備相同結構的新表但不復制資料。

create table [if not exists] like [lifecycle ];

說明:

⚫ 表名與列名均對大小寫不敏感。

⚫ 在建立表時,如果不指定 if not exists選項而存在同名表,則返回報錯;若指定此選項,則無論是否存在同名表,即使原表結構與要建立的目標表結構不一致, 均返回成功。已存在的同名表的元資訊不會被改動。

⚫ 表名、列名中不能有特殊字元,只能用英文的 a-z、A-Z 及數字和下劃線(_),

且以字母開頭,名稱的長度不超過 128 位元組。

⚫tblproperties("transactional"="true"):可選(有update和delete語句必須設定)。設定表為Transactional表。後續可以對Transactional表執行update、delete操作實現行級更新或刪除資料。更多資訊,請參見更新或刪除資料(UPDATE | DELETE)

⚫ Partitioned by 指定表的分割槽欄位,目前僅支援 string型別。分割槽值不可以有雙位元組字元(如中文),必須是以英文字母 a-z、A-Z開始後可跟字母數字,名稱的長度不超過 128 位元組。允許的字元包括:空格、冒號(:)、下劃線(_)、美元符$)、井號(#)、點(.)、感嘆號(!)和@,出現其他字元行為未定義, 例如:“\t”、“\n”、“/”等。當利用分割槽欄位對錶進行分割槽時,新增分割槽、更新分割槽內資料和讀取分割槽資料均不需要做全表掃描,可以提高處理效率。

⚫ 註釋內容是長度不超過 1024 位元組的有效字串。

⚫ lifecycle 指明此表的生命週期,單位:天。create table like 語句不會複製源表

的生命週期屬性。

⚫ 理論上源表分割槽最多隻能 6 級,但考慮極限儲存的分割槽膨脹方式,請儘可能少用

分割槽。

⚫ 一個表允許的分割槽個數支援按照具體的 project 配置,預設 60000 個。

⚫ 在create table ... as select ...語句中,如果在 select 子句中使用常量作為列的

值,建議指定列的名字。

⚫ 如果希望源表和目標表具有相同的表結構,可以嘗試使用 create table ... like 操

作。

5.4.1.1.1建表具體案例

  1. 列名雙引號要去掉
  2. 形如BIGINT primary key identity(1,1)主鍵⾃增列要去掉,只保留預設值default 1
  3. numeric資料型別要轉為decimal
  4. 形如::character varying,'1900/01/01'::text這種,兩個冒號及後⾯內容要刪除,MC不⽀持
  5. 形如"n_car_no" numeric DEFAULT -1::numeric,MC不⽀持預設值為-1,需要去掉
  6. 形如"ts_req_time" timestamp without time zone DEFAULT to_timestamp('1900/00/00 00:00:00'::text, 'YYYY-MM-DD HH24:MI:SS.MS'::text),需要去掉timezone,並改為timestamp DEFAULT timestamp "1900-01-01 00:00:00"
  7. 形如INTERLEAVED SORTKEY(vc_trans_id),MC不⽀持交錯排序列功能,可以考慮替換為 zorder。
  8. MC不⽀持時區time zone,有關time zone的需要刪除。
  9. 物化檢視修改去掉 AUTO REFRESH YES,同時MaxCompute物化檢視不支援視窗函式

5.4.1.2. SQL 遷移

SQL 遷移實際上就是根據 Oracle 和MaxCompute 兩者間 SQL 的差異進行轉化,將RedShift中的 SQL 轉化成 MaxCompute 中的 SQL,從而使 SQL 可用。具體的 SQL間差異請參考《遷移前RedShift於MaxCompute的各項對比差異》 章節中的相關內容

5.4.1.2.1 SQL 遷移 具體案例

DML語句

1.執行updae或者delet的語句需要建立事務表("transactional"="true")

2. 形如COMMENT ON column atzc_dev_dw.t_com_fact_auto_pay_gw_trans_pay_gw."n_trans_amt" is 'dml';給列新增 註釋,需要改為MC⽀持的語法alter table change column comment '';

DQL語句

問題現象

遷移指導

cte(with)語句

with語句寫在insert into下面語法解析報錯

with語句移動到insert into上面


with a as ( with b as () ) 巢狀使用

MC不支援巢狀的with 需要將with拿出來

with a as () , b as ()

型別轉化

redshift都使用的是 ::

如:a::date



使用cast(a as date)

正常匹配

redshift使用的是~

使用rlike替換

group by

redshift group by中的整型常量會被當做select的列序號處理

如:group by 1,2.

SQL語句設定了屬性,即set odps.sql.groupby.position.alias=true;一起提交

型別轉化 ::

redshift ::代表型別轉化

使用cast函式轉化

資料型別

varchar

需要指定位數varchar(100)或者直接指定string

decimal 型別常量1

改成1bd

smallint 常量

1s

join

join的不等值

mc不支援普通join不等值表示式,可以使用mapjoin

內建函式

RedShift

MaxCompute

RS舉例

MC舉例

多行註釋/* xxxxx */

框選所需註釋內容,ctrl+/,進行註釋

DATEADD( datepart, interval, {date|time|timetz|timestamp} )

datetime dateadd(date|datetime|timestamp <date>, bigint <delta>, string <datepart>)

dateadd(day,1,f.dt_date)

dateadd(f.dt_date,1,'dd')

DATEDIFF ( datepart, {date|time|timetz|timestamp}, {date|time|time|timestamp} )

bigint datediff(date|datetime|timestamp <date1>, date|datetime|timestamp <date2>, string <datepart>)

datediff(min,a,b)

datediff(b,a,'mi')

current_date-n/current_date+n

dateadd(GETDATE(),n)

dateadd可以加減時間,getdate可以獲取當前時間

current_date-1

dateadd(GETDATE(),1,'dd')

型別轉化 ::

cast轉

a::date

cast(a as date)

正則 ~

rlike

日期加減current_date+30

date_add(current_date(),30)

CEILING 或 CEIL 函式用於將數字向上舍入到下一個整數。

ceil

select ceiling(commission)

select ceil(1.1);

TO_TIMETAMP 將時間戳字串轉換為時間標記

bigint unix_timestamp(datetime <date>)

to_timestamp('1900/00/00 00:00:00'as string, 'YYYY-MM-DD HH24:MI:SS.MS'as string)

unix_timestamp(cast ("1900-00-00 00:00:00" as datetime))

dateadd按指定的時間間隔遞增日期、時間、時間或時間戳值

datetime dateadd(date|datetime|timestamp <date>, bigint <delta>, string <datepart>)

dateadd(month,-6,a.dt_end_date)

dateadd(a.dt_end_date,-6,"mm")

LISTAGG 聚合函式根據 ORDER BY 表示式對該組的行進行排序,然後將值串聯成一個字串

wm_concat(string <separator>, string <colname>)

listagg(remark)

wm_Concat(",",remark)

CURRENT_DATE獲取當前日期

CURRENT_DATE()

MaxCompute需要新增括號

EXTRACT(week from $1)提取函式從 TIMESTAMP 值或表示式

weekofyear()

EXTRACT(weekday from $1) 和 extract(DOW from $1)

weekday($1)

DATEPART(WEEKDAY,T3.dt_report)

WEEKDAY(cast(T3.dt_report as DATETIME))

LEN 函式返回一個整數,表示輸入字串中的字元的數量

bigint length(string <str>)

len

length

LOWER 函式返回與輸入字串具有相同資料型別的字串

tolower(string <source>)

lower

CONVERT ( TIMESTAMP, id_card_back_overdue)

函式將值從一種資料型別轉換為另一種資料型別

轉為cast()

CONVERT ( TIMESTAMP, id_card_back_overdue)

cast(id_card_back_overdue as TIMESTAMP)

sysdate返回當前會話時區(預設為 UTC)中的當前日期和時間

getdate()

返回DATETIME ‘2017-11-11 00:00:00’

charindex()

返回指定子字串在字串中的位置

INSTR()

charindex('fish', 'dogfish')

instr('dogfish','fish')

left()這些函式返回指定數量的位於字串最左側

substr()

right()這些函式返回指定數量的位於字串最右側

reverse(substr(reverse()))

DATE_TRUNC 函式根據您指定的日期部分(如小時、周或月)截斷時間戳表示式或文字

date_trunc('month')

datetrunc(,'month')

json_extract_path_text

函式返回鍵:Value對引用 JSON 字串中的一系列路徑元素

改為get_json_object寫法get_json_object(content,'$.DeviceID')

根據key路徑獲取json字串的value

json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}}','f4', 'f6')
返回 ‘star’

json_extract_array_element_text

使用atzc_dev_dw.json_extract_array_element_text

根據索引返回陣列元素

json_extract_array_element_text('[111,112,113]', 2)
返回 ‘113’

POSITION返回指定子字串在字串中的位置

改成:instr

BTRIM函式通過刪除前導空格和尾隨空格或刪除

TRIM

maxCompute只能刪除左右空格不能刪除指定位置空格,刪除指定位置需要自己寫udf實現

date_part()從表示式中提取日期部分值

datepart()

mod()

函式返回一個數字結果

$1%$2

~~

like

date_part(w,time)

weekofyear()

4.4.1.2儲存過程遷移

建議改成臨時表或者pyodps的方式

5.4.2資料遷移

序號

描述

將Amazon Redshift資料匯出至Amazon S3資料湖(簡稱S3)。

通過物件儲存服務OSS的線上遷移上雲服務,將資料從S3遷移至OSS。

將資料從OSS遷移至同區域的MaxCompute專案中,並校驗資料完整性和正確性。

資料遷移參考文件:

https://help.aliyun.com/document_detail/181920.html

5.4.3. 測試驗證

目前RedShift到MaxCompute 遷移的資料測試驗證工作,還沒有工具可以支援,需要

自行編寫指令碼工具完成,常用校驗方案有如下幾種:

⚫ 表結構校驗,從 RedShift和MaxCompute 分別匯出資料表列及型別定義後計算

md5 進行校驗

⚫ 資料錶行數比對,執行 SQL 語句分別在 RedShift和MaxCompute 統計相同表的

資料行數進行逐行比對

⚫ 資料全量校驗,一般用於核心表且資料量較小的校驗場景,匯出全量資料計算

md5 進行校驗,或全量資料分段計算 md5 進行校驗

⚫ 資料抽樣校驗,一般用於核心大表的資料校驗場景,按一定抽樣規則從源和目標

抽取資料進行校驗。

原文連結

本文為阿里雲原創內容,未經允許不得轉載。