本文為您介紹如何使用SET命令配置MaxCompute Project的時區。
支援時區功能的作業如下:
MapReduce支援時區功能。
Spark支援時區功能。
對於提交到MaxCompute計算叢集的任務,可自動擷取Project的時區。
對於通過yarn-client模式啟動(例如spark-shell,spark-sql,pyspark等)的設定,您需要手動設定Driver的啟動參數(spark-defaults.conf),增加
spark.driver.extraJavaOptions -Duser.timezone=America/Los_Angeles
,timezone的值為將要使用的時區。
PAI支援時區功能。
Graph支援時區功能。
配置時區
MaxCompute Project時區預設是中國的東八區,DATETIME、TIMESTAMP、DATE類型欄位以及相關時間內建函數按照東八區進行計算。您可以通過以下兩種方式配置時區:
Session層級:執行
SET odps.sql.timezone=<timezoneid>;
語句,需要與計算語句一起提交。--設定時區為Asia/Tokyo。 SET odps.sql.timezone=Asia/Tokyo; --查詢當前時區。 SELECT getdate(); output: +------------+ | _c0 | +------------+ | 2018-10-30 23:49:50 | +------------+
Project層級:執行
setproject odps.sql.timezone=<timezoneid>;
語句,此命令需要專案所有者(Project Owner)執行。重要Project的時區一旦被設定,相關的時間計算會取設定後的時區,原有的作業資料將會受到影響。因此,請您謹慎考慮是否有必要設定時區。如果必要,建議只對新增的Project進行時區設定,不對已有資料的Project進行設定。
使用限制及注意事項
SQL內建日期函數、UDF、UDT、UDJ、
SELECT TRANSFORM
支援擷取Project Timezone屬性來配置時區。時區支援的格式類型為
Asia/Shanghai
(存在夏令時跳變),不支援GMT+9格式。當SDK時區與Project時區不同時,DATETIME類型轉換為STRING類型的操作需設定GMT時區。
時區配置後,通過DataWorks執行相關SQL時,某些時間段的日期顯示會存在差異。例如,1900~1928年的日期時間差異為5分52秒,1900年之前的日期時間差異為9秒。
為了保證MaxCompute在多個時區DATETIME類型資料的正確性,MaxCompute服務、Java SDK以及用戶端將會進行版本更新(-oversea尾碼的Java SDK或用戶端版本),更新後可能影響MaxCompute中已經儲存的早於1928年的DATETIME類型資料的顯示。
對於非中國東八區的地區,建議您同步更新Java SDK或用戶端版本,以保證在1900-01-01之後的SQL計算結果及Tunnel傳輸資料的準確性和一致性。對於早於1900-01-01的DATETIME資料,SQL的計算顯示結果和Tunnel傳輸資料仍然可能存在343秒的差異。對於新版本SDK或用戶端,之前已經上傳的早於1928-01-01的DATETIME資料,在新版本中日期時間會減少352秒。
如果繼續使用不帶有-oversea尾碼的SDK或用戶端,SQL計算結果和Tunnel傳輸資料將存在差異。早於1900-01-01的資料差異為9秒,1900-01-01~1928-01-01的資料差異為352秒。
說明Java SDK或用戶端版本更新配置時區不影響DataWorks的時區配置,因此時區會存在差異,需要您對DataWorks中定時任務調度的影響進行計算評估。DataWorks伺服器在日本地區的時區是GMT+9,在新加坡Region的時區是GMT+8。
通過JDBC串連的第三方用戶端需要在用戶端設定時區,保證與服務端時區設定的一致性。