2015-09-07 40 views
4

我使用了關於分析的BigQuery。 我寫了這個查詢。BigQuery無法創建視圖,但查詢正常

[setup_chr_lvs]的模式是

userID是STRING,

LV是STRIMG,

chrLvs是STRING

「[1,25,344]」(例如)

SELECT userId, 
    lv, 
    INTEGER(SPLIT(REGEXP_REPLACE(REGEXP_REPLACE(chrLvs, r'\[', ''), r'\]', ''), ",")) AS chrLv 
    FROM [kpi.setup_chr_lvs] 

該模式成功。 但不能保存視圖。

無法創建視圖。 無法爲字段chrLV創建有效的輸出模式。 嘗試在最外層的SELECT中重命名chrLv to f0_group.chrLv

爲什麼?

回答

0

不知道BigQuery的內部,我想這是因爲在某些層次上,你的chrLvs被分解成部分屬性,稱爲「chrLv」,這會讓系統混淆。

您是否嘗試將您的「as」重命名爲建議內容?

2

首先,錯誤消息的瘋狂的建議實際上可以工作 - 而不是你的AS chrLv,有AS f0_group.chrLv。我甚至不會試圖解釋究竟爲什麼,因爲我不能,但我可以給出一些背景知道什麼時候發生這種事情,以及如何解決這個問題。

這裏的關鍵是SPLITSPLIT創建repeated values,其中單行和單列包含多個值。 當SPLIT "a,b,c" as val時,立即結果是單個行,其模式將會說val: string (repeated)

當您使用SPLIT運行查詢時,默認情況下查詢結果將變平坦:包含3重複值的單個行將變成3行。當您嘗試保存視圖時,行爲是不同的:它不會變平。這就是爲什麼你可以查詢但不保存視圖。 (如果需要,可以通過設置查詢選項來重現unflattened行爲:取消選中「Flatten Results」(也稱爲「Allow Large」和「Select Table」)。當您將函數應用於重複值時會發生這種情況。 SPLIT創建一個重複的輸出,並且INTEGER適用於此,在表達式的模式中觸發一個驚喜。

解決方法是在應用該功能之前刪除重複 - 將其平鋪爲多行。首先是SPLIT,然後是FLATTEN,然後是INTEGER。就像這樣:

SELECT 
    userId, 
    lv, 
    INTEGER(chrLvStr) as chrLv 
FROM FLATTEN(
    (
    SELECT 
    userId, 
    lv, 
    SPLIT(REGEXP_REPLACE(REGEXP_REPLACE(chrLvs, r'\[', ''), r'\]', ''), ",") AS chrLvStr 
    FROM [test.setup_chr_lvs] 
), 
    chrLvStr 
) 

這將運行(並可以保存爲一個視圖),其中[test.setup_chr_lvs]是從該查詢保存數據的一個行的模型:

select "user1" as userId, "lv1" as lv, "[1, 24, 344]" as chrLvs 

(不,我做沒有我用於FLATTEN的縮進約定。)