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还会造成大量数据的扫描,可以使用自定义多子分区来进行数据的存储,查询时更加友好