一條拼了40min的hql引發的思考

2021-07-29 00:15:26 字數 1263 閱讀 6340

週末加班,拼一條hql花了40min,裡面有許多小細節,特別記錄下來方便以後使用。

hive表裡存的是個thrift結構。我們關注的主要字段如下:

struct uploaddataitem 

struct uploaddata

struct ***

uploaddata裡面的資料格式如下:

","name":"***","counter":0,"timestamp":0,"fromsdk":false,"category":"***","sourcepackage":null,"id":null,"bucket":0}]}
現在我們的需求就是希望拿到每個bucket裡對用的量分別有多少。

select regexp_extract(a.item.data, '"bucket":(\\d)', 1), count(*)

from (select explode(uploaddata.uploaddataitems) as item

from push.xmpush_upload_data_internal tablesample(1 percent)

where date = 20170318

and deviceinfo.os = '7.3.15'

) awhere regexp_extract(a.item.data, '"bucket":(\\d)', 1) <> ''

group by regexp_extract(a.item.data, '"bucket":(\\d)', 1)

因為uploaddataitems裡是個list,所以我們需要先用explode將一行變為多行,先生成乙個中間虛擬表。explode裡面有諸多的注意事項,具體參考之前的文章

可能是因為json格式實在太過靈活,個人感覺hive對json的支援不是特別好。所以乾脆直接用正則匹配的方式來得到bucket後面對應的具體值。hive正則相關的內容,請參考之前的文章

因為data的型別是個string,而且bucket不一定每次都出現,所以經常出現正則匹配出來為空的情況。一則我們需要為空的情況,二來為空的情況多了以後特別容易造成資料傾斜,所以我們需要將這種情況排除掉。hive空值的底層儲存比較複雜與混亂,具體可以參考本文

本例中空值的情況為』』。

當表的資料比較大的時候,可以先對表進行抽樣,得到資料的抽樣結果,可以快速驗證邏輯正確性。例子中的tablesample(1 percent)就是對錶進行1%的抽樣。

一條clickhouse SQL語句引發的問題思考

前段時間在實際工作中,使用者的一條sql引發了我一些思考。寫一篇簡單的博文來記錄下。實際表的列名等已替換。select from db1.table1 as t1 left join db2.table2 as t2 on t1.col1 t2.col2 where t1.time 2020 01 ...

一條命令引發的思考

背景 要求把 user目錄裡31乙個省份資料夾許可權全部更改為700許可權,並給在群裡貼出修改的命令如下 hadoop fs chmod r 700 user 操作 這個還不簡單,就是手敲下各個身份嘛,頗為簡單,直接開工如下 hadoop fs chmod r 700 user hadoop fs ...

一條cltq指令引發的血案

文章 我的個人部落格上了 但是很久沒有維護已經被關掉了。現在重新將裡面的東西移到csdn上了。兩個 a.c b.c,a.c裡實現了乙個函式 void malloc2d 返回乙個void型的二級指標,然後b.c裡會呼叫這個malloc2d的函式,但是在除錯的時候始終得不到正確的值,遂用gdb進行除錯一...