RedShift到MaxCompute迁移实践指导
簡(jiǎn)介:?本文主要介紹Amazon Redshift如何遷移到MaxCompute,主要從語法對(duì)比和數(shù)據(jù)遷移兩方面介紹,由于Amazon Redshift和MaxCompute存在語法差異,這篇文章講解了一下語法差異
1.概要
本文檔詳細(xì)介紹了Redshift和MaxCompute之間SQL語法的異同。這篇文檔有助于加快sql任務(wù)遷移到MaxCompute。由于Redshift和MaxCompute之間語法存在很多差異,因此我們需要修改Redshift上編寫的腳本,然后才能在MaxCompute中使用,因?yàn)榉?wù)之間的SQL方言不同。
2.遷移前RedShift于MaxCompute的各項(xiàng)對(duì)比差異
2.1.1數(shù)據(jù)類型對(duì)比及類型轉(zhuǎn)化
| 類別 | MaxCompute | 建議轉(zhuǎn)化成MaxCompute類型 | Redshift | |
| 數(shù)值類型 | 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 數(shù)據(jù)類型 | boolean | Y | Y | Y |
| 復(fù)雜數(shù)據(jù)類型 | ARRAY | Y | Y | N |
| MAP | Y | Y | N | |
| STRUCT | Y | Y | N | |
| HLLSketch | N | Y |
MaxCompoute數(shù)據(jù)類型參考2.0數(shù)據(jù)類型版本 - MaxCompute - 阿里云
2.1.2語法對(duì)比
MaxCompute沒有schenma、group、庫、存儲(chǔ)過程的概念。只有project、表、分區(qū),MaxCompute建表時(shí)沒有自增序列 外鍵等,不支持指定編碼默認(rèn)utf-8,內(nèi)部表不支持指定存儲(chǔ)格式默認(rèn)Aliorc
| 主要區(qū)別 | |
| 表結(jié)構(gòu) | 不能修改分區(qū)列列名,只能修改分區(qū)列對(duì)應(yīng)的值。 |
| 支持增加列,但是不支持刪除列以及修改列的數(shù)據(jù)類 型。 | |
| SQL 常見問題 | INSERT 語法上最直觀的區(qū)別是:Insert into/overwrite 后面 有個(gè)關(guān)鍵字 Table。 |
| 數(shù)據(jù)插入表的字段映射不是根據(jù) Select 的別名做的,而 是根據(jù) Select 的字段的順序和表里的字段的順序 | |
| UPDATE/DELETE | 只有事務(wù)表支持UPDATE/DELETE |
| join | Join 必須要用 on 設(shè)置關(guān)聯(lián)條件,不支持笛卡爾積 |
| 觸發(fā)器 | 不支持觸發(fā)器、 |
| 創(chuàng)建外部函數(shù) | maxCompute沒有外部函數(shù) |
| 精度 | DOUBLE 類型存在精度問題。 不建議在關(guān)聯(lián)時(shí)候進(jìn)行直接等號(hào)關(guān)聯(lián)兩 個(gè) DOUBLE字段,建議把兩個(gè)數(shù)做減 法,如果差距小于一個(gè)預(yù)設(shè)的值就認(rèn)為 是相同,例如 abs(a1- a2) < 0.000000001。 目前產(chǎn)品上已經(jīng)支持高精度的類型 DECIMAL。 |
| 日期 | MaxCompute主要的日期類型是datetime(格式y(tǒng)yyy-mm-dd hh:mi:ss) timestamp date,datetime支持的內(nèi)建函數(shù)更加豐富,建議日期轉(zhuǎn)成datetime做運(yùn)算,日期函數(shù)鏈接 |
| 存儲(chǔ)過程 | 使用MaxCompute的pyodps修改 |
| 物化視圖 | 要更新物化化視圖中的數(shù)據(jù),MaxCompute只能手動(dòng)更新,不支持自動(dòng)更新 |
| 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復(fù)合表達(dá)式
| MaxCompute | REDAHIFT | |
| +、- | Y | Y |
| ^、|/、||/ | Y | Y |
| *、/、% | Y | Y |
| @ | N | Y |
| &、|、 | Y | Y |
| || | Y | Y |
| #、~、<<、>> | 使用shift函數(shù)替換 | Y |
2.1.4條件比較
| MaxCompute | REDAHIFT | |
| <> 或 != | Y | Y |
| like | Y | Y |
| BETWEEN?expression?AND | Y | Y |
| IS [ NOT ] NULL | Y | Y |
| EXISTS | Y | Y |
| POSIX 運(yùn)算符 | N | Y |
| SIMILAR TO | N | Y |
| IN | Y | Y |
| 正則 ~ | Rlike | Y |
| ~~ | like | Y |
2.1.5DDL語法
主要差異:
1.MaxCompute不支持主鍵自增和PRIMARY KEY
2.指定默認(rèn)值default]不支持使用函數(shù)
3.decimal指定默認(rèn)值不支持-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內(nèi)部表不需要添加屬性) | 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(事務(wù)表支持) | Y |
| DELETE … WHERE | Y(事務(wù)表支持) | 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內(nèi)建函數(shù)對(duì)比
其他未列出的redshift函數(shù)不支持。
| 函數(shù)類型 | MaxCompute | POSTGRESQL | 在MaxCompute SQL中是否支持分區(qū)剪裁 |
| 日期函數(shù) | 無 | 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 |
| |
| DATE_ADD | DATEADD |
| |
| DATEPART | date_part |
| |
| DATETRUNC | date_trunc |
| |
| FROM_UNIXTIME | 無 |
| |
| GETDATE | CURRENT_DATE |
| |
| ISDATE | 無 |
| |
| LASTDAY | 無 |
| |
| TO_DATE | TO_DATE |
| |
| TO_CHAR | to_char |
| |
| UNIX_TIMESTAMP | extract |
| |
| WEEKDAY | 無 |
| |
| WEEKOFYEAR | 無 |
| |
| YEAR | extract |
| |
| QUARTER | EXTRACT |
| |
| MONTH | EXTRACT |
| |
| DAY | EXTRACT |
| |
| DAYOFMONTH | 無 |
| |
| HOUR | EXTRACT |
| |
| MINUTE | EXTRACT |
| |
| CURRENT_TIMESTAMP | CURRENT_TIMESTAMP |
| |
| ADD_MONTHS | 運(yùn)算符+ |
| |
| LAST_DAY | LAST_DAY |
| |
| NEXT_DAY | NEXT_DAY |
| |
| MONTHS_BETWEEN | MONTHS_BETWEEN |
| |
| 數(shù)學(xué)函數(shù) | 無 | exp | |
| 無 | ATAN2 | ||
| 無 | DEXP | ||
| 無 | DLOG1 | ||
| 無 | DLOG10 | ||
| ABS | ABS |
| |
| ACOS | ACOS |
| |
| ASIN | ASIN |
| |
| ATAN | ATAN |
| |
| CEIL | CEIL |
| |
| CONV | convert |
| |
| COS | COS |
| |
| COSH | ACOS |
| |
| COT | COT |
| |
| EXP | EXP |
| |
| FLOOR | FLOOR |
| |
| LN | LN |
| |
| LOG | LOG |
| |
| POW | power |
| |
| RAND | random |
| |
| ROUND | ROUND |
| |
| SIN | SIN |
| |
| SINH | asin |
| |
| SQRT | SQRT |
| |
| TAN | TAN |
| |
| TANH | atan |
| |
| TRUNC | TRUNC |
| |
| LOG2 | LOG |
| |
| LOG10 | LOG |
| |
| BIN | 無 |
| |
| HEX | 無 |
| |
| UNHEX | 無 |
| |
| RADIANS | RADIANS |
| |
| DEGREES | DEGREES |
| |
| SIGN | SIGN |
| |
| E | 無 |
| |
| PI | PI |
| |
| FACTORIAL | 無 |
| |
| CBRT | CBRT |
| |
| SHIFTLEFT | << |
| |
| SHIFTRIGHT | >> |
| |
| SHIFTRIGHTUNSIGNED | >>> |
| |
| 窗口函數(shù) | 無 | CUME_DIST | |
| 無 | FIRST_VALUE/LAST_VALUE | ||
| 無 | LISTAGG | ||
| 無 | NTH_VALUE | ||
| 無 | PERCENTILE_CONT | ||
| 無 | PERCENTILE_DISC | ||
| 無 | RATIO_TO_REPORT (?ratio_expression?) OVER ( [ PARTITION BY?partition_expression?] ) | ||
| 無 | STDDEV_SAMP | ||
| 無 | VAR_SAMP | VARIANCE | VAR_POP | ||
| 無 | PERCENT_RANK | ||
| DENSE_RANK | DENSE_RANK |
| |
| RANK | RANK |
| |
| LAG | LAG |
| |
| LEAD | LEAD |
| |
| PERCENT_RANK | PERCENT_RANK |
| |
| ROW_NUMBER | ROW_NUMBER |
| |
| CLUSTER_SAMPLE | 無 |
| |
| NTILE | NTILE |
| |
| 聚合函數(shù) | PERCENTILE_APPROX | APPROXIMATE PERCENTILE_DISC | |
| 無 | LISTAGG | ||
| 無 | PERCENTILE_CONT | ||
| ANY_VALUE | ANY_VALUE | ||
| COUNT | COUNT |
| |
| AVG | AVG |
| |
| MAX | MAX |
| |
| MIN | MIN |
| |
| MEDIAN | PERCENTILE_disc |
| |
| STDDEV | STDDEV |
| |
| STDDEV_SAMP | STDDEV_SAMP |
| |
| SUM | SUM |
| |
| WM_CONCAT | string_agg |
| |
| COLLECT_LIST | 無 |
| |
| COLLECT_SET | 無 |
| |
| VARIANCE/VAR_POP | VARIANCE/VAR_POP |
| |
| VAR_SAMP | VAR_SAMP |
| |
| COVAR_POP | COVAR_POP |
| |
| COVAR_SAMP | COVAR_SAMP |
| |
| PERCENTILE | PERCENTILE_disc |
| |
| 字符串函數(shù) | 無 | || |
|
| 無 | 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 | 無 |
| |
| CHR | CHR |
| |
| CONCAT | CONCAT|array_concat |
| |
| GET_JSON_OBJECT | 無 |
| |
| INSTR | 無 |
| |
| IS_ENCODING | 無 |
| |
| KEYVALUE | 無 |
| |
| LENGTH | LENGTH |
| |
| LENGTHB | LEN |
| |
| MD5 | 無 |
| |
| REGEXP_EXTRACT | 無 |
| |
| REGEXP_INSTR | REGEXP_INSTR |
| |
| REGEXP_REPLACE | REGEXP_REPLACE |
| |
| REGEXP_SUBSTR | REGEXP_SUBSTR |
| |
| REGEXP_COUNT | REGEXP_COUNT |
| |
| SPLIT_PART | SPLIT_PART |
| |
| SUBSTR | SUBSTR |
| |
| SUBSTRING | SUBSTRING |
| |
| TOLOWER | LOWER |
| |
| TOUPPER | UPPER |
| |
| TRIM | TRIM |
| |
| LTRIM | LTRIM |
| |
| RTRIM | RTRIM |
| |
| REVERSE | REVERSE |
| |
| REPEAT | REPEAT |
| |
| ASCII | ASCII |
| |
| CONCAT_WS | CONCAT_WS |
| |
| LPAD | LPAD |
| |
| RPAD | RPAD |
| |
| REPLACE | REPLACE |
| |
| SOUNDEX | SOUNDEX |
| |
| SUBSTRING_INDEX | SUBSTRING_INDEX |
| |
| TRANSLATE | TRANSLATE |
| |
| URL_DECODE | 無 |
| |
| URL_ENCODE | 無 |
| |
| CRC32 | 無 |
| |
| 其他函數(shù) | CAST | CAST |
|
| COALESCE | COALESCE |
| |
| DECODE | DECODE |
| |
| GET_IDCARD_AGE | 無 |
| |
| GET_IDCARD_BIRTHDAY | 無 |
| |
| GET_IDCARD_SEX | 無 |
| |
| GREATEST | GREATEST |
| |
| ORDINAL | 無 |
| |
| LEAST | LEAST |
| |
| MAX_PT | 無 |
| |
| UUID | uuid_generate_v1 |
| |
| SAMPLE | 無 |
| |
| IF | IF |
| |
| CASE WHEN | CASE WHEN |
| |
| SPLIT | SPLIT |
| |
| STR_TO_MAP | 無 |
| |
| EXPLODE | split_to_array |
| |
| MAP | 無 |
| |
| MAP_KEYS | 無 |
| |
| MAP_VALUES | 無 |
| |
| NVL | NVL |
| |
| ARRAY | ARRAY |
| |
| SIZE | get_array_length |
| |
| ARRAY_CONTAINS | @> |
| |
| POSEXPLODE | 無 |
| |
| TRANS_ARRAY | 無 |
| |
| INLINE | 無 |
| |
| NAMED_STRUCT | 無 |
| |
| 無 | SUBARRAY |
2.1.8 MaxCompute 產(chǎn)品特性
| 功能 | MaxCompute 產(chǎn)品組件 | 特性介紹 |
| 數(shù)據(jù)存儲(chǔ) | MaxCompute 表 (基于盤古 分布式存儲(chǔ)) | MaxCompute 支持大規(guī)模計(jì)算存儲(chǔ),適用于 TB 以上規(guī)模的存 儲(chǔ)及計(jì)算需求,最大可達(dá) EB 級(jí)別。同一個(gè) MaxCompute 項(xiàng) 目支持企業(yè)從 創(chuàng)業(yè)團(tuán)隊(duì)發(fā)展到獨(dú)角獸的數(shù)據(jù)規(guī)模需求; 數(shù)據(jù) 分布式存儲(chǔ),多副本冗余,數(shù)據(jù)存儲(chǔ)對(duì)外僅開放 表的 操作接口,不提供文件系統(tǒng)訪問接口 MaxCompute 支持大規(guī)模計(jì)算存儲(chǔ),適用于 TB 以上規(guī)模的存 儲(chǔ)及計(jì)算需求,最大可達(dá) EB 級(jí)別。同一個(gè) MaxCompute 項(xiàng)目支持企業(yè)從 創(chuàng)業(yè)團(tuán)隊(duì)發(fā)展到獨(dú)角獸的數(shù)據(jù)規(guī)模需求; 數(shù)據(jù)分布式存儲(chǔ),多副本冗余,數(shù)據(jù)存儲(chǔ)對(duì)外僅 開放表的操作接口,不提供文件系統(tǒng)訪問接口; 自研數(shù)據(jù)存儲(chǔ)結(jié)構(gòu),表數(shù)據(jù)列式存儲(chǔ),默認(rèn)高度 壓縮,后續(xù)將提供兼容 ORC的Ali-ORC存儲(chǔ)格 式; 支持外表,將存儲(chǔ)在OSS 對(duì)象存儲(chǔ)、OTS表格 存儲(chǔ)的數(shù)據(jù)映射為二維表; 支持Partition、Bucket 的分區(qū)、分桶存儲(chǔ); 更底層不是 HDFS,是阿里自研的盤古文件系 統(tǒng),但可借助 HDFS 理解對(duì)應(yīng)的表之下文件的 體系結(jié)構(gòu)、任務(wù)并發(fā)機(jī)制使用時(shí),存儲(chǔ)與計(jì)算解 耦,不需要僅僅為了存儲(chǔ)擴(kuò)大不必要的計(jì)算資 源; |
| 存儲(chǔ) | Pangu | 阿里自研分布式存儲(chǔ)服務(wù),類似 HDFS。 MaxCompute 對(duì)外目前只暴露表接口,不能直 接訪問文件系統(tǒng)。 |
| 資源調(diào)度 | Fuxi | 阿里自研的資源調(diào)度系統(tǒng),類似 Yarn |
| 數(shù)據(jù)上傳下載 | Tunnel Streaming Tunnel | 不暴露文件系統(tǒng),通過 Tunnel 進(jìn)行批量數(shù)據(jù)上傳下載 |
| 開發(fā)&診斷 | Dataworks/Studio/Logview | 配套的數(shù)據(jù)同步、作業(yè)開發(fā)、工作流編排調(diào)度、 作業(yè)運(yùn)維及診斷工具。開源社區(qū)常見的 Sqoop、Kettle、Ozzie 等實(shí)現(xiàn)數(shù)據(jù)同步和調(diào)度 |
| 用戶接口 | CLT/SDK | 統(tǒng)一的命令行工具和 JAVA/PYTHON SDK |
| SQL | MaxCompute SQL | TPC-DS 100%支持,同時(shí)語法高度兼容 Hive, 有Hive 背景,開發(fā)者直接上手,特別在大數(shù)據(jù) 規(guī)模下性能強(qiáng)大。 * 完全自主開發(fā)的 compiler,語言功能開發(fā)更 靈活,迭代快,語法語義檢查更加靈活高效 * 基于代價(jià)的優(yōu)化器,更智能,更強(qiáng)大,更適合 復(fù)雜的查詢 * 基于LLVM 的代碼生成,讓執(zhí)行過程更高效 * 支持復(fù)雜數(shù)據(jù)類型(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)、腳本運(yùn)行模式、參數(shù)化視圖 * 支持外表(外部數(shù)據(jù)源+StorageHandler,支 持非結(jié)構(gòu)化數(shù)據(jù)) |
| Spark | MaxCompute Spark | MaxCompute提供了Spark on MaxCompute 的解決方案,使 MaxCompute 提供兼容開源的 Spark 計(jì)算服務(wù),讓它在統(tǒng)一的計(jì)算資源和數(shù)據(jù) 集權(quán)限體系之上,提供 Spark 計(jì)算框架,支持用 戶以熟悉的開發(fā)使用方式提交運(yùn)行 Spark 作 業(yè)。 * 支持原生多版本 Spark 作業(yè): Spark1.x/Spark2.x作業(yè)都可運(yùn)行; * 開源系統(tǒng)的使用體驗(yàn):Spark-submit 提交方 式,提供原生的 Spark WebUI供用戶查看; * 通過訪問OSS、OTS、database 等外部數(shù)據(jù) 源,實(shí)現(xiàn)更復(fù)雜的 ETL 處理,支持對(duì) OSS 非結(jié) 構(gòu)化進(jìn)行處理; * 使用 Spark 面向 MaxCompute 內(nèi)外部數(shù)據(jù) 開展機(jī)器學(xué)習(xí), 擴(kuò)展應(yīng)用場(chǎng)景 |
| 機(jī)器學(xué)習(xí) | PAI | MaxCompute 內(nèi)建支持的上百種機(jī)器學(xué)習(xí)算 法,目前 MaxCompute 的機(jī)器學(xué)習(xí)能力由 PAI 產(chǎn)品進(jìn)行統(tǒng)一提供服務(wù),同時(shí) PAI提供了深度學(xué) 習(xí)框架、Notebook 開發(fā)環(huán)境、GPU計(jì)算資源、 模型在線部署的彈性預(yù)測(cè)服務(wù)。MaxCompute 的數(shù)據(jù)對(duì)PAI產(chǎn)品無縫集成。 |
| 數(shù)據(jù)接入 | 目前支撐通過 DTS或者 DataWorks數(shù)據(jù)集成功能 | 數(shù)據(jù)集成是穩(wěn)定高效、彈性伸縮的數(shù)據(jù)同步平臺(tái),豐富的異構(gòu)數(shù)據(jù)源之間高速穩(wěn)定的數(shù)據(jù)移動(dòng)及同步能力。支持實(shí)時(shí)任務(wù)和批任務(wù)寫入MaxCompute |
| 整體 | 不是孤立的功能,完整的企業(yè) 服務(wù) | 不需要多組件集成、調(diào)優(yōu)、定制,開箱即用 |
3、RedShift到MaxCompute遷移工具介紹
從數(shù)據(jù)庫表導(dǎo)入到 Amazon S3
卸載數(shù)據(jù) - Amazon Redshift
在線遷移上云服務(wù)
AWS S3 遷移教程 - 在線遷移服務(wù) - 阿里云
將數(shù)據(jù)從OSS遷移至同區(qū)域的MaxCompute項(xiàng)目load命令
LOAD - MaxCompute - 阿里云
語法校驗(yàn)工具二選一
MaxCompute studio
認(rèn)識(shí)MaxCompute Studio - MaxCompute - 阿里云
DataWorks sql節(jié)點(diǎn)
創(chuàng)建ODPS SQL節(jié)點(diǎn) - DataWorks - 阿里云
4、遷移整體方案
數(shù)據(jù)庫遷移主要包含以下內(nèi)容
遷移實(shí)施計(jì)劃:
| 序號(hào) | 項(xiàng)目 | 預(yù)估時(shí)間 |
| 1 | 調(diào)研評(píng)估 | 1~2周 |
| 2 | 方案設(shè)計(jì) | 1~2周 |
| 3 | 資源規(guī)劃 | 1周 |
| 4 | 改造與測(cè)試驗(yàn)證 | 5~7周,需要根據(jù)復(fù)雜度評(píng)估 |
| 5 | 生成割接 | 1~2周 |
5、遷移詳細(xì)方案
5.1. 現(xiàn)狀分析及需求分析
5.2. 遷移方案設(shè)計(jì)
用戶根據(jù)自身現(xiàn)有 RedShift數(shù)據(jù)量、QPS、TPS 等性能指標(biāo)、高可用需求和未來業(yè)務(wù)增長(zhǎng)需求,制定合理化的遷移方案。
5.3. 資源規(guī)劃
用戶需要準(zhǔn)備好 MaxCompute 的相關(guān)環(huán)境,同時(shí)獲取到對(duì)應(yīng)需要使用的遷移工具。遷移工具的相關(guān)內(nèi)容請(qǐng)參考《 RedShift到MaxCompute遷移工具介紹 》 章節(jié)。
5.4. 改造及測(cè)試驗(yàn)證
5.4.1. 改造
遷移工具可以利用MaxCompute studio(或者DataWorks新建sql節(jié)點(diǎn))客戶端語法校驗(yàn),新建一個(gè)sql文件,如圖不支持的語法會(huì)報(bào)紅
MaxCompute Studio安裝文檔認(rèn)識(shí)MaxCompute Studio - MaxCompute - 阿里云
5.4.1.1. 建表
在RedShift中獲取表列表和表字段定義,按照Maxcompute支持的字段值進(jìn)行轉(zhuǎn)換,對(duì)于有update和delete語句的表必須建成Transactional表
類型轉(zhuǎn)化參考《數(shù)據(jù)類型對(duì)比及類型轉(zhuǎn)化》章節(jié)
建表語法
--創(chuàng)建新表。
create [external] table [if not exists]
[( ?[not null] [default ] [comment ], ...)]
[comment ]
[partitioned by ( ?[comment ], ...)]
--用于創(chuàng)建聚簇表時(shí)設(shè)置表的Shuffle和Sort屬性。
[clustered by | range clustered by ( [, , ...]) [sorted by ( [asc | desc] [, ?[asc | desc] ...])] into ?buckets]
--僅限外部表。
[stored by StorageHandler]
--僅限外部表。
[with serdeproperties (options)]
--僅限外部表。
[location ]
--指定表為Transactional表,后續(xù)可以對(duì)該表執(zhí)行更新或刪除表數(shù)據(jù)操作,但是Transactional表有部分使用限制,請(qǐng)根據(jù)需求創(chuàng)建。
[tblproperties("transactional"="true")] ?
[lifecycle ];
--基于已存在的表創(chuàng)建新表并復(fù)制數(shù)據(jù),但不復(fù)制分區(qū)屬性。
create table [if not exists] ?[lifecycle ] as ;
--基于已存在的表創(chuàng)建具備相同結(jié)構(gòu)的新表但不復(fù)制數(shù)據(jù)。
create table [if not exists] ?like ?[lifecycle ];
說明:
? 表名與列名均對(duì)大小寫不敏感。
? 在創(chuàng)建表時(shí),如果不指定 if not exists選項(xiàng)而存在同名表,則返回報(bào)錯(cuò);若指定此選項(xiàng),則無論是否存在同名表,即使原表結(jié)構(gòu)與要?jiǎng)?chuàng)建的目標(biāo)表結(jié)構(gòu)不一致, 均返回成功。已存在的同名表的元信息不會(huì)被改動(dòng)。
? 表名、列名中不能有特殊字符,只能用英文的 a-z、A-Z 及數(shù)字和下劃線(_),
且以字母開頭,名稱的長(zhǎng)度不超過 128 字節(jié)。
?tblproperties("transactional"="true"):可選(有update和delete語句必須設(shè)置)。設(shè)置表為Transactional表。后續(xù)可以對(duì)Transactional表執(zhí)行update、delete操作實(shí)現(xiàn)行級(jí)更新或刪除數(shù)據(jù)。更多信息,請(qǐng)參見更新或刪除數(shù)據(jù)(UPDATE | DELETE)。
? Partitioned by 指定表的分區(qū)字段,目前僅支持 string類型。分區(qū)值不可以有雙字節(jié)字符(如中文),必須是以英文字母 a-z、A-Z開始后可跟字母數(shù)字,名稱的長(zhǎng)度不超過 128 字節(jié)。允許的字符包括:空格、冒號(hào)(:)、下劃線(_)、美元符$)、井號(hào)(#)、點(diǎn)(.)、感嘆號(hào)(!)和@,出現(xiàn)其他字符行為未定義, 例如:“\t”、“\n”、“/”等。當(dāng)利用分區(qū)字段對(duì)表進(jìn)行分區(qū)時(shí),新增分區(qū)、更新分區(qū)內(nèi)數(shù)據(jù)和讀取分區(qū)數(shù)據(jù)均不需要做全表掃描,可以提高處理效率。
? 注釋內(nèi)容是長(zhǎng)度不超過 1024 字節(jié)的有效字符串。
? lifecycle 指明此表的生命周期,單位:天。create table like 語句不會(huì)復(fù)制源表
的生命周期屬性。
? 理論上源表分區(qū)最多只能 6 級(jí),但考慮極限存儲(chǔ)的分區(qū)膨脹方式,請(qǐng)盡可能少用
分區(qū)。
? 一個(gè)表允許的分區(qū)個(gè)數(shù)支持按照具體的 project 配置,默認(rèn) 60000 個(gè)。
? 在create table ... as select ...語句中,如果在 select 子句中使用常量作為列的
值,建議指定列的名字。
? 如果希望源表和目標(biāo)表具有相同的表結(jié)構(gòu),可以嘗試使用 create table ... like 操
作。
5.4.1.1.1建表具體案例
5.4.1.2. SQL 遷移
SQL 遷移實(shí)際上就是根據(jù) Oracle 和MaxCompute 兩者間 SQL 的差異進(jìn)行轉(zhuǎn)化,將RedShift中的 SQL 轉(zhuǎn)化成 MaxCompute 中的 SQL,從而使 SQL 可用。具體的 SQL間差異請(qǐng)參考《遷移前RedShift于MaxCompute的各項(xiàng)對(duì)比差異》 章節(jié)中的相關(guān)內(nèi)容
5.4.1.2.1 SQL 遷移 具體案例
DML語句
1.執(zhí)行updae或者delet的語句需要?jiǎng)?chuàng)建事務(wù)表("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語句
| 問題現(xiàn)象 | 遷移指導(dǎo) | |
| cte(with)語句 | with語句寫在insert into下面語法解析報(bào)錯(cuò) | with語句移動(dòng)到insert into上面 |
|
MC不支持嵌套的with 需要將with拿出來 | with a as () , b as () | |
| 類型轉(zhuǎn)化 | redshift都使用的是 :: 如:a::date
| 使用cast(a as date) |
| 正常匹配 | redshift使用的是?~ | 使用rlike替換 |
| group by | redshift group by中的整型常量會(huì)被當(dāng)做select的列序號(hào)處理 如:group by 1,2. | SQL語句設(shè)置了屬性,即set odps.sql.groupby.position.alias=true;一起提交 |
| 類型轉(zhuǎn)化 :: | redshift ::代表類型轉(zhuǎn)化 | 使用cast函數(shù)轉(zhuǎn)化 |
| 數(shù)據(jù)類型 | varchar | 需要指定位數(shù)varchar(100)或者直接指定string |
| decimal 類型常量1 | 改成1bd | |
| smallint 常量 | 1s | |
| join | join的不等值 | mc不支持普通join不等值表達(dá)式,可以使用mapjoin |
內(nèi)建函數(shù)
| RedShift | MaxCompute | RS舉例 | MC舉例 |
| 多行注釋/* xxxxx */ | 框選所需注釋內(nèi)容,ctrl+/,進(jìn)行注釋 | ||
| 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可以加減時(shí)間,getdate可以獲取當(dāng)前時(shí)間 | current_date-1 | dateadd(GETDATE(),1,'dd') |
| 類型轉(zhuǎn)化 :: | cast轉(zhuǎn) | a::date | cast(a as date) |
| 正則 ~ | rlike | ||
| 日期加減current_date+30 | date_add(current_date(),30) | ||
| CEILING 或 CEIL 函數(shù)用于將數(shù)字向上舍入到下一個(gè)整數(shù)。 | ceil | select ceiling(commission) | select ceil(1.1); |
| TO_TIMETAMP 將時(shí)間戳字符串轉(zhuǎn)換為時(shí)間標(biāo)記 | 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按指定的時(shí)間間隔遞增日期、時(shí)間、時(shí)間或時(shí)間戳值 | 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 聚合函數(shù)根據(jù) ORDER BY 表達(dá)式對(duì)該組的行進(jìn)行排序,然后將值串聯(lián)成一個(gè)字符串 | wm_concat(string <separator>, string <colname>) | listagg(remark) | wm_Concat(",",remark) |
| CURRENT_DATE獲取當(dāng)前日期 | CURRENT_DATE() MaxCompute需要添加括號(hào) | ||
| EXTRACT(week from $1)提取函數(shù)從 TIMESTAMP 值或表達(dá)式 | weekofyear() | ||
| EXTRACT(weekday from $1) 和 extract(DOW from $1) | weekday($1) | ||
| DATEPART(WEEKDAY,T3.dt_report) | WEEKDAY(cast(T3.dt_report as DATETIME)) | ||
| LEN 函數(shù)返回一個(gè)整數(shù),表示輸入字符串中的字符的數(shù)量 | bigint length(string <str>) | len | length |
| LOWER 函數(shù)返回與輸入字符串具有相同數(shù)據(jù)類型的字符串 | tolower(string <source>) | lower | |
| CONVERT ( TIMESTAMP, id_card_back_overdue) 函數(shù)將值從一種數(shù)據(jù)類型轉(zhuǎn)換為另一種數(shù)據(jù)類型 | 轉(zhuǎn)為cast() | CONVERT ( TIMESTAMP, id_card_back_overdue) | cast(id_card_back_overdue as TIMESTAMP) |
| sysdate返回當(dāng)前會(huì)話時(shí)區(qū)(默認(rèn)為 UTC)中的當(dāng)前日期和時(shí)間 | getdate() 返回DATETIME ‘2017-11-11 00:00:00’ | ||
| charindex() 返回指定子字符串在字符串中的位置 | INSTR() | charindex('fish', 'dogfish') | instr('dogfish','fish') |
| left()這些函數(shù)返回指定數(shù)量的位于字符串最左側(cè) | substr() | ||
| right()這些函數(shù)返回指定數(shù)量的位于字符串最右側(cè) | reverse(substr(reverse())) | ||
| DATE_TRUNC 函數(shù)根據(jù)您指定的日期部分(如小時(shí)、周或月)截?cái)鄷r(shí)間戳表達(dá)式或文字 date_trunc('month') | datetrunc(,'month') | ||
| json_extract_path_text 函數(shù)返回鍵:Value對(duì)引用 JSON 字符串中的一系列路徑元素 | 改為get_json_object寫法get_json_object(content,'$.DeviceID') | 根據(jù)key路徑獲取json字符串的value | json_extract_path_text('{"f2":{"f3":1},"f4":{"f5":99,"f6":"star"}}','f4', 'f6') |
| json_extract_array_element_text | 使用atzc_dev_dw.json_extract_array_element_text | 根據(jù)索引返回?cái)?shù)組元素 | json_extract_array_element_text('[111,112,113]', 2) |
| POSITION返回指定子字符串在字符串中的位置 | 改成:instr | ||
| BTRIM?函數(shù)通過刪除前導(dǎo)空格和尾隨空格或刪除 | TRIM maxCompute只能刪除左右空格不能刪除指定位置空格,刪除指定位置需要自己寫udf實(shí)現(xiàn) | ||
| date_part()從表達(dá)式中提取日期部分值 | datepart() | ||
| mod() 函數(shù)返回一個(gè)數(shù)字結(jié)果 | $1%$2 | ||
| ~~ | like | ||
| date_part(w,time) | weekofyear() |
4.4.1.2存儲(chǔ)過程遷移
建議改成臨時(shí)表或者pyodps的方式
5.4.2數(shù)據(jù)遷移
| 序號(hào) | 描述 |
| ① | 將Amazon Redshift數(shù)據(jù)導(dǎo)出至Amazon S3數(shù)據(jù)湖(簡(jiǎn)稱S3)。 |
| ② | 通過對(duì)象存儲(chǔ)服務(wù)OSS的在線遷移上云服務(wù),將數(shù)據(jù)從S3遷移至OSS。 |
| ③ | 將數(shù)據(jù)從OSS遷移至同區(qū)域的MaxCompute項(xiàng)目中,并校驗(yàn)數(shù)據(jù)完整性和正確性。 |
數(shù)據(jù)遷移參考文檔:
Amazon Redshift數(shù)據(jù)遷移至MaxCompute - MaxCompute - 阿里云
5.4.3. 測(cè)試驗(yàn)證
目前RedShift到MaxCompute 遷移的數(shù)據(jù)測(cè)試驗(yàn)證工作,還沒有工具可以支持,需要
自行編寫腳本工具完成,常用校驗(yàn)方案有如下幾種:
? 表結(jié)構(gòu)校驗(yàn),從 RedShift和MaxCompute 分別導(dǎo)出數(shù)據(jù)表列及類型定義后計(jì)算
md5 進(jìn)行校驗(yàn)
? 數(shù)據(jù)表行數(shù)比對(duì),執(zhí)行 SQL 語句分別在 RedShift和MaxCompute 統(tǒng)計(jì)相同表的
數(shù)據(jù)行數(shù)進(jìn)行逐行比對(duì)
? 數(shù)據(jù)全量校驗(yàn),一般用于核心表且數(shù)據(jù)量較小的校驗(yàn)場(chǎng)景,導(dǎo)出全量數(shù)據(jù)計(jì)算
md5 進(jìn)行校驗(yàn),或全量數(shù)據(jù)分段計(jì)算 md5 進(jìn)行校驗(yàn)
? 數(shù)據(jù)抽樣校驗(yàn),一般用于核心大表的數(shù)據(jù)校驗(yàn)場(chǎng)景,按一定抽樣規(guī)則從源和目標(biāo)
抽取數(shù)據(jù)進(jìn)行校驗(yàn)。
原文鏈接
本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。
?
總結(jié)
以上是生活随笔為你收集整理的RedShift到MaxCompute迁移实践指导的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里巴巴云原生混部系统 Koordina
- 下一篇: opencv 图像访问索引