2017-11-15 4 views
1

私はImpalaで作業していますが、ImpalaとSQLの両方でかなり経験はありませんが、次のような形になります。Impalaの制約のためにピボットを使用することはできませんが、これは通常の状況下では希望の結果が得られません。どのように私はこのような何かをやって行くのです、だから、インパラのSQLビルドの列は行データに基づいており、追加の行データを持つ列にデータを入力します

+-----------+---------------------+-------+ 
| dayname   | utc_hour   | some | 
+-----------+---------------------+-------+ 
| Wednesday | 2017-11-08 00:00:00 | 20 | 
| Wednesday | 2017-11-08 01:00:00 | 11 | 
| Wednesday | 2017-11-08 09:00:00 | 1  | 
| Wednesday | 2017-11-08 11:00:00 | 40 | 
| Wednesday | 2017-11-08 12:00:00 | 0  | 
| Wednesday | 2017-11-08 13:00:00 | 6  | 
| Wednesday | 2017-11-08 14:00:00 | 0  | 
| Wednesday | 2017-11-08 16:00:00 | 2  | 
| Wednesday | 2017-11-08 17:00:00 | 10 | 
| Wednesday | 2017-11-08 19:00:00 | 5  | 
| Thursday | 2017-11-09 07:00:00 | 1  | 
| Thursday | 2017-11-09 12:00:00 | 0  | 
| Thursday | 2017-11-09 13:00:00 | 0  | 
| Thursday | 2017-11-09 14:00:00 | 58 | 
| Friday | 2017-11-10 09:00:00 | 0  | 
| Friday | 2017-11-10 10:00:00 | 0  | 
| Friday | 2017-11-10 16:00:00 | 0  | 
+-----------+---------------------+-------+ 

select 
dayname(date) as dayname, 
utc_hour, 
sum(case when (`type` IN ('Awesome')) then 1 else 0 end) as some 
FROM (select *, trunc(cast(floor(date/1000) as timestamp), "HH") as utc_hour 
FROM COOLNESSTYPES 
WHERE date >= 1510082633596 and month >= '2017-11' 
)  a 
GROUP BY utc_hour, dayname 
ORDER BY utc_hour; 

と、次のデータを返します。

はこれまでのところ、私はこのようになりますSQL SELECTステートメントを持っていますか? Clouderaのコミュニティページでは、誰かが共用体の使用をお勧めしていますが、私の列を自分のutc_hour列の行の値としてどのようにラベル付けするかについてはっきりしていません。 (必要に応じて、組合の提案の詳細については、https://community.cloudera.com/t5/Interactive-Short-cycle-SQL/Transpose-columns-to-rows/td-p/49667を参照してください)

これに関する助力やアイデアは非常に高く評価されます。ありがとう!

答えて

1

本当に変更する列名が必要な場合は、複雑さが増します。あなたが固定されたカラム名を許容できる場合にピボットはこれらの線に沿って、簡単です:

select 
     dayname 
    , extract(dow from utc_hour) d_of_w 
    , max(case when date_part('day', utc_hour) = 0 then somecol end) hour_0 
    , max(case when date_part('day', utc_hour) = 7 then somecol end) hour_7 
    , max(case when date_part('day', utc_hour) = 9 then somecol end) hour_9 
    , max(case when date_part('day', utc_hour) = 12 then somecol end) hour_12 
    , max(case when date_part('day', utc_hour) = 14 then somecol end) hour_14 
from COOLNESSTYPES 
group by 
     d_of_w 
    , dayname 

私は今、(おかげでhbombする)上に示す代わりにdate_part()extract(hour from utc_hour)を使用して、この例のために私の例を開発するためにはPostgresを使用しました。

| dayname | d_of_w | hour_0 | hour_7 | hour_9 | hour_12 | hour_14 | 
|-----------|--------|--------|--------|--------|---------|---------| 
| Wednesday |  3 |  20 | (null) |  1 |  0 |  0 | 
| Friday |  5 | (null) | (null) |  0 | (null) | (null) | 
| Thursday |  4 | (null) |  1 | (null) |  0 |  58 | 

参照:http://sqlfiddle.com/#!17/81cfd/2(Postgresの)

あなたを変更する列名を達成するためには、「動的SQL」を必要とし、これはインパラで可能であるならば、あることが明らかになっていない率直であることを(Iドンなどその製品を使用しないでください)。

+1

これは私が必要としていたものです。私は最初のSQL(またはそれから派生したもの)を共通のテーブル式としてセットアップし、上で述べたことを実装することができました。 唯一の他の問題は、EXTRACTの代わりにImpalaで、同じ結果を得るために、EXTRACTではなくdate_part( 'day'、utc_hour)です。再度、感謝します! – hbomb

+0

フィードバックをいただきありがとうございます。私はdate_part()構文がより顕著になるように質問に追加します。 –

+0

dayofweek(utc_hour)は、おそらく、Impalaの日付時刻機能ライブラリFWIWより優れた関数オプションです – hbomb

関連する問題