maxcompute相关

1、多条JSON嵌套格式解析

类似于这种格式的字符串:"{...},{...}"

LATERAL VIEW EXPLODE(SPLIT(SUBSTR(strs,3,LENGTH(orgpoiids)-4),'},{')) ex AS str

然后取出每一条JSON中的内容的方式,将分隔好的字符串再拼接位JSON,进一步解析:

GET_JSON_OBJECT(CONCAT('{',str,'}'),'$.id') AS id

2、当需要JOIN张表且数据量较大,导致任务跑不动

这个时候可以通过创建中间表或者视图的方式,每次将前两张表的JOIN结果进一步与下张表做JOIN

PS:在SQL没办法进一步优化时可以使用,当然也需要进一步探究简洁的解决办法

3、分割字符串的一些方法

SELECT SPLIT('a,s,d,f,g',',')[0];--a 分割后从数组中取出,索引从0开始

SELECT SPLIT_PART('a,s,d,f,g',',',1);--a 直接取出,下标从1开始

4、将datetime或者timestamp格式的时间作为时间轴来使用,比如一天内将时间轴划分为5min的粒度

CONCAT(SPLIT(SPLIT(create_time,' ')[1],':')[0],':',LPAD(CAST(FLOOR(CAST(SPLIT(SPLIT(create_time,' ')[1],':')[1] AS INT)/5)*5 AS STRING ),2,'0'))

5、尽量避免IN的使用,IN的时间复杂度以及对内存都不够友好

select * from A where A.adiu IN (select adiu from B)
for(int i=0;i<A.length;i++){
    for(int j=0;j<B.length;j++){
        if(A[i].adiu==B[j].adiu){
            return A[i].id;
        }
    }
}

一方面时间复杂度过高,另一方面会把数据拉到内存中,可能造成内存溢出

6、INSERT OVERWRITE TABLE t_test PARTITION (dt='${date}')

因为类似HDFS这种存储不适用主键,所以插入数据时就可能造成数据重复,所以推荐使用分区表+INSERT OVERWRITE TABLE来使用

避免插入数据重复,并且可以重复执行

7、WITH AS ()

为了提高SQL的可读性,可以使用WITH AS 

8、分区表的PARTITIONED BY可以创建多分区字段

为了避免当日分区只使用dt还会造成大量数据的扫描,可以使用自定义多子分区来进行数据的存储,查询时更加友好


版权声明:本文为weixin_47894524原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。