二十二 clickhouse的json函式

2022-09-18 17:57:07 字數 4711 閱讀 7928

在yandex.metrica中,使用者使用json作為訪問引數。為了處理這些json,實現了一些函式。(儘管在大多數情況下,json是預先進行額外處理的,並將結果值放在單獨的列中。)所有的這些函式都進行了盡可能的假設。以使函式能夠盡快的完成工作。

我們對json格式做了如下假設:

欄位名稱(函式的引數)必須使常量。

欄位名稱必須使用規範的編碼。例如:visitparamhas('', 'abc') = 1,但是 visitparamhas('', 'abc') = 0

函式可以隨意的在多層巢狀結構下查詢字段。如果存在多個匹配字段,則返回第乙個匹配字段。

json除字串文字外不存在空格字元。

--1.visitparamhas(引數,名稱)

檢查是否存在«name»名稱的字段

--2.visitparamextractuint(引數,名稱)

將名為«name»的字段的值解析成uint64。如果這是乙個字串字段,函式將嘗試從字串的開頭解析乙個數字。如果該字段不存在,或無法從它中解析到數字,則返回0。

--3.visitparamextractint(引數,名稱)

與visitparamextractuint相同,但返回int64。

--4.visitparamextractfloat(引數,名稱)

與visitparamextractuint相同,但返回float64。

--5.visitparamextractbool(引數,名稱)

解析true/false值。其結果是uint8型別的。

--6.visitparamextractraw(引數,名稱)

返回欄位的值,包含空格符。

示例:visitparamextractraw('', 'abc') = '"\\n\\u0000"'

visitparamextractraw('}', 'abc') = ''

visitparamextractstring(引數,名稱)

使用雙引號解析字串。這個值沒有進行轉義。如果轉義失敗,它將返回乙個空白字串。

示例:visitparamextractstring('', 'abc') = '\n\0'

visitparamextractstring('', 'abc') = '☺'

visitparamextractstring('', 'abc') = ''

visitparamextractstring('', 'abc') = ''

目前不支援\u***x\uyyyy這些字元編碼,這些編碼不在基本多文種平面中(它們被轉化為cesu-8而不是utf-8)。

以下函式基於simdjson,專為更複雜的json解析要求而設計。但上述假設2仍然適用。

--7.jsonhas(json[, indices_or_keys]…)

如果json中存在該值,則返回1。

如果該值不存在,則返回0。

示例:select jsonhas('', 'b') = 1

select jsonhas('', 'b', 4) = 0

indices_or_keys可以是零個或多個引數的列表,每個引數可以是字串或整數。

string = 按成員名稱訪問json物件成員。

正整數 = 從頭開始訪問第n個成員/成員名稱。

負整數 = 從末尾訪問第n個成員/成員名稱。

您可以使用整數來訪問json陣列和json物件。

例如:select jsonextractkey('', 1) = 'a'

select jsonextractkey('', 2) = 'b'

select jsonextractkey('', -1) = 'b'

select jsonextractkey('', -2) = 'a'

select jsonextractstring('', 1) = 'hello'

--8.jsonlength(json[, indices_or_keys]…)

返回json陣列或json物件的長度。

如果該值不存在或型別錯誤,將返回0。

示例:select jsonlength('', 'b') = 3

select jsonlength('') = 2

--9.jsontype(json[, indices_or_keys]…)

返回json值的型別。

如果該值不存在,將返回null。

示例:select jsontype('') = 'object'

select jsontype('', 'a') = 'string'

select jsontype('', 'b') = 'array'

--10.jsonextractuint(json[, indices_or_keys]…)

jsonextractint(json[, indices_or_keys]…)

jsonextractfloat(json[, indices_or_keys]…)

jsonextractbool(json[, indices_or_keys]…)

解析json並提取值。這些函式類似於visitparam*函式。

如果該值不存在或型別錯誤,將返回0。

示例:select jsonextractint('', 'b', 1) = -100

select jsonextractfloat('', 'b', 2) = 200.0

select jsonextractuint('', 'b', -1) = 300

--11.jsonextractstring(json[, indices_or_keys]…)

解析json並提取字串。此函式類似於visitparamextractstring函式。

如果該值不存在或型別錯誤,則返回空字串。

該值未轉義。如果unescaping失敗,則返回乙個空字串。

示例:select jsonextractstring('', 'a') = 'hello'

select jsonextractstring('', 'abc') = '\n\0'

select jsonextractstring('', 'abc') = '☺'

select jsonextractstring('', 'abc') = ''

select jsonextractstring('', 'abc') = ''

--12.jsonextract(json[, indices_or_keys…], return_type)

解析json並提取給定clickhouse資料型別的值。

這是以前的jsonextract函式的變體。 這意味著jsonextract(…, 『string』)返回與jsonextractstring()返回完全相同。jsonextract(…, 『float64』)返回於jsonextractfloat()`返回完全相同。

示例:select jsonextract('', 'tuple(string, array(float64))') = ('hello',[-100,200,300])

select jsonextract('', 'tuple(b array(float64), a string)') = ([-100,200,300],'hello')

select jsonextract('', 'b', 'array(nullable(int8))') = [-100, null, null]

select jsonextract('', 'b', 4, 'nullable(int64)') = null

select jsonextract('', 'passed', 'uint8') = 1

select jsonextract('', 'day', 'enum8(\'sunday\' = 0, \'monday\' = 1, \'tuesday\' = 2, \'wednesday\' = 3, \'thursday\' = 4, \'friday\' = 5, \'saturday\' = 6)') = 'thursday'

select jsonextract('', 'day', 'enum8(\'sunday\' = 0, \'monday\' = 1, \'tuesday\' = 2, \'wednesday\' = 3, \'thursday\' = 4, \'friday\' = 5, \'saturday\' = 6)') = 'friday'

--13.jsonextractkeysandvalues(json[, indices_or_keys…], value_type)

從json中解析鍵值對,其中值是給定的clickhouse資料型別。

示例:select jsonextractkeysandvalues('}', 'x', 'int8') = [('a',5),('b',7),('c',11)];

jsonextractraw(json[, indices_or_keys]…)

返回json的部分。

如果部件不存在或型別錯誤,將返回空字串。

示例:select jsonextractraw('', 'b') = '[-100, 200.0, 300]'

二十二,雜感

恩,二十二了,感覺是個turning point。二十二是中國男公民法定結婚年齡,但是因為我連女朋友都沒有,所以,這個話題暫不談論。其實剛到上海的時候,就準備把那些將要發生的辛酸點滴記錄下來,可是不知怎麼的,真正到辛酸的時候,卻不想去記憶了。那些歷程確實值得懷念,但是想起來就感覺不好,或許這就是所謂...

二十二 封裝

namespace demo7 this.age age this public int getage public void stuinfo 年齡為 方式一 public int age 方式二 private int age 字段 內部 public int age 讀取許可權 set 預設屬性...

HTML 頭部(二十二)

頭元素包含關於文件的概要資訊,也稱為元資訊 meta information meta 意為 關於某方面的資訊 可以這麼說,元資料 meta data 是關於資料的資訊,而元資訊是關於資訊的資訊。頭元素內的元素不會被瀏覽器顯示出來。根據 html 標準,僅有幾個標籤在 html 的頭部分是合法的。它...