天天看點

MaxCompute問答整理之12月

問題一、MaxCompute内建日期函數,DATEPART函數指令格式為 bigint datepart(datetime date, string datepart)用于提取日期date中指定的時間機關datepart的值。DATETIME類型。如果輸入為STRING類型會隐式轉換為DATETIME類型後參與運算,其它類型抛異常。但是客戶在使用函數的時候沒有實作STRING類型隐式轉換為DATETIME。報錯資訊:FAILED:ODPS-0130121:[1,50] Invalid type STRING of argument 1 for function datepart, expect DATETIME。如何解決?

打開新類型odps.sql.type.system.odps2=true時某些隐式類型轉換會被禁用,包括STRING->BIGINT,STRING->DATETIME,DOUBLE->BIGINT,DECIMAL->DOUBLE,DECIMAL->BIGINT都是有精度損失或者報錯的風險。這種情況可以通過cast函數做強制轉換的方式來解決或者關掉新類型flag。
例如:select datepart(cast('2019-12-02 00:00:30' as datetime),'yyyy');


set odps.sql.type.system.odps2=false

問題二:MaxCompute中的資料通道Datahub 和 Tunnel 應用場景的差別是什麼?

Datahub是阿裡雲上的實時消息隊列服務,與MaxCompute緊密內建。使用者可以将實時資料寫入Datahub的topic,并通過Datahub的投遞政策,定期将資料投遞到MaxComptue表,滿足實時資料準實時寫入MaxCompute的需要。

Tunnel 用于批量上傳資料到離線表裡,适用于離線計算的場景。

可參考文檔了解更多:

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

問題三:MaxCompute表如何設定自增序列?

可以使用ROW_NUMBER函數去實作。例如:select ROW_NUMBER() OVER(),* from tablename;

可參考文檔:

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

問題四:如何使用MaxCompute Java SDK設定SQL的Flag?

使用DataWorks或MaxCompute Console送出SQL時,通常需要設定SQL的Flag。如果需要使用MaxCompute新資料類型,通過Session級别方式開啟,則需要在涉及新資料類型的SQL前加Set Flag語句:set odps.sql.type.system.odps2=true;。 使用SDK送出SQL時,不能簡單地把Set Flag語句直接放到SQL Query中執行。以Java SDK為例,設定Flag的正确方式如下。 // 構造SQLTask對象。SQLTask task = new SQLTask();task.setName("foobar");task.setQuery("select ...");// 設定flag。Map settings = new HashMap<>();settings.put("odps.sql.type.system.odps2", "true");... // 設定其它flags。task.setProperty("settings", new JSONObject(settings).toString()); // 這裡是關鍵:将flags對應的json string設定到settings property中。Instance instance = odps.instances().create(task); // 執行。

問題五:MaxCompute SQL中運作分區表全表掃描後,為什麼會費用增加?

全表掃描費用增加是因為輸入量增加了,例如有一張表按時間(天)分區,存放了365個分區(365天)資料,全表掃描則輸入量為365個分區的資料量,如果用分區裁剪隻取某個分區(某天)資料,則輸入量就隻有那個分區的資料量。

問題六:MaxCompute中,select * from sale_detail order by region; 報錯:Semantic analysis exception-ORDER BY must be used with a LIMET clause

ORDER BY 必須與limit共同使用。ORDER BY沒有與limit共同使用時,報錯傳回。

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

問題七:在 MaxCompute 中,一張表的分區的數量是否越多越好?

在 MaxCompute 中,一張表最多允許有 60000 個分區,同時每個分區的容量沒有上限。但是分區數量過多,會導緻統計和分析過程非常不友善。

MaxCompute 也會限制單個作業中最多不能超過一定數量的 instance,而作業中的 instance 和您輸入的資料量和分區數量密切相關的。是以您需要根據業務需要,選擇合适的分區政策。

問題八:如果一開始并沒有分區字段,是否可以增加或更改分區?

您不可以在源表上直接增加或更改分區鍵,分區鍵一旦建立就不能更改。但您可以重新建立一張分區表,使用動态分區SQL把源表資料導入到新分區表。

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

問題九:如何檢視MaxCompute資料量?

1、針對全表,檢視實體空間,您可以使用desc指令

2、如果要檢視表的資料條數,需要使用SQL。例如select count() as cnt from iris;

問題十:在MaxCompute中,需要将一行轉化為多行的時候,我們該如何解決?

Lateral View和split,explode等UDTF一起使用,它能夠将一行資料拆成多行資料,并在此基礎上對拆分後的資料進行聚合。

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

更多阿裡巴巴大資料計算技術和産品資訊,可點選連結加入 MaxCompute開發者社群2群

https://h5.dingtalk.com/invite-page/index.html?bizSource=____source____&corpId=dingb682fb31ec15e09f35c2f4657eb6378f&inviterUid=E3F28CD2308408A8&encodeDeptId=0054DC2B53AFE745

或掃碼加入

MaxCompute問答整理之12月