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 |
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 |
|
||
DATEADD |
|
||
date_part |
|
||
date_trunc |
|
||
無 |
|
||
CURRENT_DATE |
|
||
無 |
|
||
無 |
|
||
TO_DATE |
|
||
to_char |
|
||
extract |
|
||
無 |
|
||
無 |
|
||
extract |
|
||
EXTRACT |
|
||
EXTRACT |
|
||
EXTRACT |
|
||
無 |
|
||
EXTRACT |
|
||
EXTRACT |
|
||
CURRENT_TIMESTAMP |
|
||
運算子+ |
|
||
LAST_DAY |
|
||
NEXT_DAY |
|
||
MONTHS_BETWEEN |
|
||
無 |
exp |
||
無 |
ATAN2 |
||
無 |
DEXP |
||
無 |
DLOG1 |
||
無 |
DLOG10 |
||
ABS |
|
||
ACOS |
|
||
ASIN |
|
||
ATAN |
|
||
CEIL |
|
||
convert |
|
||
COS |
|
||
ACOS |
|
||
COT |
|
||
EXP |
|
||
FLOOR |
|
||
LN |
|
||
LOG |
|
||
power |
|
||
random |
|
||
ROUND |
|
||
SIN |
|
||
asin |
|
||
SQRT |
|
||
TAN |
|
||
atan |
|
||
TRUNC |
|
||
LOG |
|
||
LOG |
|
||
無 |
|
||
無 |
|
||
無 |
|
||
RADIANS |
|
||
DEGREES |
|
||
SIGN |
|
||
無 |
|
||
PI |
|
||
無 |
|
||
CBRT |
|
||
<< |
|
||
>> |
|
||
>>> |
|
||
無 |
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 |
|
||
RANK |
|
||
LAG |
|
||
LEAD |
|
||
PERCENT_RANK |
|
||
|
|||
無 |
|
||
|
|||
APPROXIMATE PERCENTILE_DISC |
|||
無 |
LISTAGG |
||
無 |
PERCENTILE_CONT |
||
ANY_VALUE |
ANY_VALUE |
||
COUNT |
|
||
AVG |
|
||
MAX |
|
||
MIN |
|
||
PERCENTILE_disc |
|
||
STDDEV |
|
||
STDDEV_SAMP |
|
||
SUM |
|
||
string_agg |
|
||
無 |
|
||
無 |
|
||
VARIANCE/VAR_POP |
|
||
VAR_SAMP |
|
||
COVAR_POP |
|
||
COVAR_SAMP |
|
||
PERCENTILE_disc |
|
||
無 |
|| |
|
|
無 |
BPCHARCMP |
||
無 |
BTRIM |
||
無 |
CHAR_LENGTH |
||
無 |
CHARACTER_LENGTH |
||
無 |
CHARINDEX |
||
無 |
COLLATE |
||
無 |
CRC32 |
||
無 |
DIFFERENCE |
||
無 |
INITCAP |
||
無 |
OCTETINDEX |
||
無 |
OCTET_LENGTH |
||
無 |
QUOTE_IDENT |
||
無 |
QUOTE_LITERAL |
||
無 |
POSITION |
||
無 |
REPEAT |
||
無 |
LEFT /RIGHT |
||
無 |
STRPOS |
||
無 |
STRTOL |
||
無 |
|
||
CHR |
|
||
CONCAT|array_concat |
|
||
無 |
|
||
無 |
|
||
無 |
|
||
無 |
|
||
LENGTH |
|
||
LEN |
|
||
無 |
|
||
無 |
|
||
REGEXP_INSTR |
|
||
REGEXP_REPLACE |
|
||
REGEXP_SUBSTR |
|
||
REGEXP_COUNT |
|
||
SPLIT_PART |
|
||
SUBSTR |
|
||
SUBSTRING |
|
||
LOWER |
|
||
UPPER |
|
||
TRIM |
|
||
LTRIM |
|
||
RTRIM |
|
||
REVERSE |
|
||
REPEAT |
|
||
ASCII |
|
||
CONCAT_WS |
|
||
LPAD |
|
||
RPAD |
|
||
|
|||
|
|||
|
|||
TRANSLATE |
|
||
無 |
|
||
無 |
|
||
CRC32 |
無 |
|
|
CAST |
|
||
COALESCE |
|
||
DECODE |
|
||
無 |
|
||
無 |
|
||
無 |
|
||
GREATEST |
|
||
無 |
|
||
LEAST |
|
||
無 |
|
||
uuid_generate_v1 |
|
||
無 |
|
||
IF |
|
||
CASE WHEN |
|
||
SPLIT |
|
||
無 |
|
||
split_to_array |
|
||
無 |
|
||
無 |
|
||
無 |
|
||
NVL |
|
||
ARRAY |
|
||
get_array_length |
|
||
@> |
|
||
無 |
|
||
無 |
|
||
無 |
|
||
無 |
|
||
無 |
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://help.aliyun.com/document_detail/94352.html
將資料從OSS遷移至同區域的MaxCompute專案load命令
語法校驗工具二選一
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建表具體案例
- 列名雙引號要去掉
- 形如BIGINT primary key identity(1,1)主鍵⾃增列要去掉,只保留預設值default 1
- numeric資料型別要轉為decimal
- 形如::character varying,'1900/01/01'::text這種,兩個冒號及後⾯內容要刪除,MC不⽀持
- 形如"n_car_no" numeric DEFAULT -1::numeric,MC不⽀持預設值為-1,需要去掉
- 形如"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"
- 形如INTERLEAVED SORTKEY(vc_trans_id),MC不⽀持交錯排序列功能,可以考慮替換為 zorder。
- MC不⽀持時區time zone,有關time zone的需要刪除。
- 物化檢視修改去掉 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上面 |
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') |
json_extract_array_element_text |
使用atzc_dev_dw.json_extract_array_element_text |
根據索引返回陣列元素 |
json_extract_array_element_text('[111,112,113]', 2) |
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 進行校驗
⚫ 資料抽樣校驗,一般用於核心大表的資料校驗場景,按一定抽樣規則從源和目標
抽取資料進行校驗。
本文為阿里雲原創內容,未經允許不得轉載。