MaxCompute - ODPS重装上阵 第三弹 - 复杂类型
摘要: MaxCompute(原ODPS)是阿里云自主研發的具有業界領先水平的分布式大數據處理平臺, 尤其在集團內部得到廣泛應用,支撐了多個BU的核心業務。 MaxCompute除了持續優化性能外,也致力于提升SQL語言的用戶體驗和表達能力,提高廣大ODPS開發者的生產力。
點此查看原文
MaxCompute(原ODPS)是阿里云自主研發的具有業界領先水平的分布式大數據處理平臺, 尤其在集團內部得到廣泛應用,支撐了多個BU的核心業務。 MaxCompute除了持續優化性能外,也致力于提升SQL語言的用戶體驗和表達能力,提高廣大ODPS開發者的生產力。
MaxCompute基于ODPS2.0新一代的SQL引擎,顯著提升了SQL語言編譯過程的易用性與語言的表達能力。我們在此推出MaxCompute(ODPS2.0)重裝上陣系列文章
第一彈 - 善用MaxCompute編譯器的錯誤和警告
第二彈 - 新的基本數據類型與內建函數
第三彈 - 復雜類型
第四彈 - CTE,VALUES,SEMIJOIN
上次向您介紹了 新的基本數據類型與內建函數,這次向您介紹復雜數據類型
原ODPS也支持兩種復雜類型,ARRAY, MAP,但是有些場景下還是不夠用
場景1
我的項目里,生成的一個中間表,為了優化性能,里面有一列最好是個數組,因為如果把數組打散,每行上存一個元素,會因為其他列的重復導致數據量爆炸。首先想從上游表中生成這個數組,搜索半天文檔,發現唯一的方式是把源數據列先轉STRING,再用wm_concat聚合,再用split函數打散成ARRAY,這樣原來類型信息丟了,不過STRING似乎也能用,好,繼續。后面的運算有個地方需要取數組最后一個元素,試圖用數組下標配合size函數,my_array[size(my_array)], 發現報告錯誤,下標必須是常量,可是我的數組不是定長的,看看有沒有函數能反轉數組呢?沒有!最后不得不放棄使用數組。。。
場景2
我的任務是為每個廣告生成一個曲線,代表隨著廣告商的出價由低到高,預計的impression, click次數的曲線。最自然的表達是有個數據結構,里面存著出價,impression次數,click次數。可是ODPS不支持這樣的用法,只好encode成一個字符串,每次操作先編碼,再解碼。好麻煩,效率也很差,可是沒有辦法。。。
MaxCompute采用基于ODPS2.0的SQL引擎,大幅度改進了復雜類型并提供了配套的內建函數,基本解決了上述問題。
復雜類型的擴充
此文中采用MaxCompute Studio作展示 ( MaxCompute從2.8.0.2版本開始支持復雜類型,如果您的版本不夠新,請升級到最新版本 )。
首先,安裝MaxCompute Studio,導入測試MaxCompute項目,創建工程,建立一個新的MaxCompute腳本文件, 如下
運行后,可以在MaxCompute Studio的Project Explorer中找到新創建的表,察看表的詳細信息,并預覽數據,如下圖
可以看到MaxCompute支持ARRAY, MAP, STRUCT類型,并且可以任意嵌套使用。
MaxCompute Studio支持含新類型表數據的導入導出,可參考此ATA文章
MaxCompute支持的復雜類型見下表
復雜類型構造與操作函數
在UDF中使用復雜類型
原ODPS不支持在UDF中訪問任何復雜類型。MaxCompute Java UDF支持所有復雜類型,Python UDF也會在不久的將來支持。
JAVA UDF中復雜類型的表示方法
ODPS的UDF分為三大類:UDF,UDAF,UDTF,其中:
1.UDAF和UDTF通過@Resolve annotation來指定sinature,在MaxCompute 2.0上線后,用戶將可以在Resolve annotation中。如 @Resolve(“array,struct
@Resolve("struct<a:bigint>,string->string") public class UdfArray extends UDF {public String evaluate(List<String> vals, Long len) {return vals.get(len.intValue());}public String evaluate(Map<String,String> map, String key) {return map.get(key);}public String evaluate(Struct struct, String key) {return struct.getFieldValue("a") + key;} }用戶可以直接將復雜類型傳入UDF中:
create function my_index as 'UdfArray' using 'myjar.jar'; select id, my_index(array('red', 'yellow', 'green'), colorOrdinal) as color_name from colors;小節
MaxCompute豐富了復雜類型的支持,可以更好的適應各種應用場景。MaxCompute仍將在兼容性,表達能力等多方面持續改進類型系統。從本系列的下一篇起,開始介紹MaxCompute在SQL語言其他方面的改進!
總結
以上是生活随笔為你收集整理的MaxCompute - ODPS重装上阵 第三弹 - 复杂类型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【新功能】MaxCompoute禁止Fu
- 下一篇: 阿里云发布链路追踪服务Tracing A