簡體   English   中英

由於CASE,蜂巢中的表空了

[英]Table empty in hive because of a CASE

我最近開始學習sql,並且以前沒有編碼經驗,因此這可能只是一個愚蠢的錯誤(在這種情況下,對較長的帖子:)感到抱歉。 如果您能幫助我解決當前的問題,那就太好了。

我有一張桌子,看起來像這樣

id / n(特定事件的名稱)/ utc(時間戳)/ json_data(包含多個參數的json字符串)。

我的目標很簡單:我正在嘗試獲取json_data中的值參數的總和(按n分組)。 不幸的是,一些問題使執行變得更加復雜。

  1. 我們存在垃圾郵件問題,導致相同的事件被發送數百或數千次,因此需要將其過濾掉。 我通常通過在group子句中使用utc(時間戳)來解決該問題,該子句還將包括其他選定的列,並獲取每個特定事件的一個實例。

  2. 某些事件在其“值字段”中返回負值,並且所有計數和求和都需要忽略這些負值。

  3. 由於事情從來都不容易,因此json_data列中value字段的名稱總是不同的,具體取決於發送的事件的類型。 但是,通過查詢中可以看到的各種字符串操作,我對此進行了很好的整理。

這是我到目前為止所得到的

SELECT
b.Event_Name as Event_Name
, COUNT(b.Event_Name) as event_occurrences
, SUM(b.item_value) as user_spendings
FROM
    (SELECT
        a.id as Player_ID
        , a.n as Event_Name
        , a.utc as timing
        , CASE 
            WHEN 
                MAX( a.ALPHA_Value
                + a.BETA_Value
                + a.GAMMA_Value
                + a.DELTA_Value
                + a.EPSILON_Value
                + a.BETAUPGRADE_Value
                + a.ZETA_Value
                + a.ALPHASKIN_Value
                + a.UPGRADEALPHA_Value) <= 0 
            THEN 0 
            ELSE 
                MAX(a.ALPHA_Value
                + a.BETA_Value
                + a.GAMMA_Value
                + a.DELTA_Value
                + a.EPSILON_Value
                + a.BETAUPGRADE_Value
                + a.ZETA_Value
                + a.ALPHASKIN_Value
                + a.UPGRADEALPHA_Value) END as item_value
        FROM
            (SELECT
                id
                , n
                , utc
                , MAX(TRIM(get_json_object(json_data, '$. ALPHA_Value '))) as ALPHA_Value
                , MAX(TRIM(get_json_object(json_data, '$. BETA_Value '))) as BETA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. GAMMA_Value ')), 6, 
                        (LOCATE(' resource 2', 
                            SUBSTR
                                (TRIM(get_json_object(json_data, '$. GAMMA_Value ')), 6))-1))) as GAMMA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. DELTA_Value ')), 6)) as DELTA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. EPSILON_Value ')), 6)) as EPSILON_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. BETAUPGRADE_Value ')), 6)) as BETAUPGRADE_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. ZETA_Value ')), 6)) as ZETA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. ALPHASKIN_Value ')), 6)) as ALPHASKIN_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. UPGRADEALPHA_Value ')), 6, 
                        (LOCATE(' resource 2', 
                            SUBSTR
                                (TRIM(get_json_object(json_data, '$. UPGRADEALPHA_Value ')), 6))-1))) as UPGRADEALPHA_Value
                FROM application_events
                WHERE
                    month = 201409
                    AND FROM_UNIXTIME(utc_timestamp) > '2014-09-04 12:00:00'
                GROUP BY id, n, utc
                ORDER BY id, n
            ) a
        GROUP by a.id, a.n, a.utc
        ORDER by timing, Event_Name
    ) b
WHERE b.item_value > 0
GROUP by b.Event_Name
ORDER by user_spendings

我的推理如下:

  1. 我從json_data中獲取了值,同時通過id,n,utc通過GROUP擺脫了垃圾郵件。 我在get_json_object上使用MAX來允許與前面的列進行分組。 由於id,name和timestamp的組合是唯一的(垃圾郵件ofc除外),因此MAX將使用相同的值。 由於每個事件只有一個值字段(根據事件類型的不同而有不同的名稱),因此我將擁有所有列,但是只有一個將有一個值(其他字段將為空)。

    1. 我擺脫了負值:現在,由於我無法在where子句中添加總和,所以我想到的唯一方法是創建另一個表(b),該表將檢查是否來自的所有值列的總和a是負數(如我所說,除了1以外,它們都將為空,因此,如果有負數,則總和也將是空的),如果不是,則返回總和(別名為item_value)。

    2. 第三張表將最終計算事件的數量並求和。

我當前的問題在第2步。當我運行Subquery a時,看起來不錯,我得到了結果。 當我在原始查詢中運行一個內部查詢(對事件進行計數並對值求和)時,我也得到了結果。 所以我想我放置條件的方式出了問題,因為完整查詢在表中沒有任何結果。

我試圖將總和放在WHERE子句中,但是沒有用。 歡迎任何想法,特別是如果您知道更簡單的方法。

非常感謝你們。

您的查詢看起來正確,我刪除了一些多余的部分(但這不是必需的):

SELECT
b.Event_Name as Event_Name
, COUNT(b.Event_Name) as event_occurrences
, SUM(b.item_value) as user_spendings
FROM (SELECT
        a.id as Player_ID
        , a.n as Event_Name
        , a.utc as timing
          COALESCE(a.ALPHA_Value, CAST(0 AS BIGINT))
        + COALESCE(a.BETA_Value, CAST(0 AS BIGINT))
        + COALESCE(a.GAMMA_Value, CAST(0 AS BIGINT))
        + COALESCE(a.DELTA_Value, CAST(0 AS BIGINT))
        + COALESCE(a.EPSILON_Value, CAST(0 AS BIGINT))
        + COALESCE(a.BETAUPGRADE_Value, CAST(0 AS BIGINT))
        + COALESCE(a.ZETA_Value, CAST(0 AS BIGINT))
        + COALESCE(a.ALPHASKIN_Value, CAST(0 AS BIGINT))
        + COALESCE(a.UPGRADEALPHA_Value, CAST(0 AS BIGINT)) as item_value
        FROM (SELECT
                id
                , n
                , utc
                , MAX(TRIM(get_json_object(json_data, '$. ALPHA_Value '))) as ALPHA_Value
                , MAX(TRIM(get_json_object(json_data, '$. BETA_Value '))) as BETA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. GAMMA_Value ')), 6, 
                        (LOCATE(' resource 2', 
                            SUBSTR
                                (TRIM(get_json_object(json_data, '$. GAMMA_Value ')), 6))-1))) as GAMMA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. DELTA_Value ')), 6)) as DELTA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. EPSILON_Value ')), 6)) as EPSILON_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. BETAUPGRADE_Value ')), 6)) as BETAUPGRADE_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. ZETA_Value ')), 6)) as ZETA_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. ALPHASKIN_Value ')), 6)) as ALPHASKIN_Value
                , MAX(SUBSTR
                    (TRIM(get_json_object(json_data, '$. UPGRADEALPHA_Value ')), 6, 
                        (LOCATE(' resource 2', 
                            SUBSTR
                                (TRIM(get_json_object(json_data, '$. UPGRADEALPHA_Value ')), 6))-1))) as UPGRADEALPHA_Value
                FROM application_events
                WHERE
                    month = 201409
                    AND FROM_UNIXTIME(utc_timestamp) > '2014-09-04 12:00:00'
                GROUP BY id, n, utc
            ) a
    ) b
WHERE b.item_value > 0
GROUP by b.Event_Name
ORDER by user_spendings

我想您要求和的一些值是NULL。 所以我加了涼粉

PS,您不需要子查詢“ b”,您可以在子查詢“ a”中執行相同的操作,但是為了更好的可讀性,我沒有觸摸它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM