web-dev-qa-db-ja.com

Hive QLのテーブルに列を追加する

Hiveでコードを記述して、1300行と6列で構成されるテーブルを作成しています。

_create table test1 as SELECT cd_screen_function,
     SUM(access_count) AS max_count,
     MIN(response_time_min) as response_time_min,
     AVG(response_time_avg) as response_time_avg,
     MAX(response_time_max) as response_time_max,
     SUM(response_time_tot) as response_time_tot,
     COUNT(*) as row_count
     FROM sheet WHERE  ts_update BETWEEN unix_timestamp('2012-11-01 00:00:00') AND 
     unix_timestamp('2012-11-30 00:00:00') and cd_office = '016'
     GROUP BY cd_screen_function ORDER BY max_count DESC, cd_screen_function;
_

ここで、1300行すべてに1つの一意の値を構成する_access_count1_として別の列を追加します。値はsum(max_count)になります。 max_countは、既存のテーブルの列です。どうすればそれができますか?このコードでテーブルを変更しようとしていますALTER TABLE test1 ADD COLUMNS (access_count1 int) set default sum(max_count);

25
user2532312

Hiveにデフォルト値を持つ列を追加することはできません列を追加するための正しい構文ALTER TABLE test1 ADD COLUMNS (access_count1 int);があり、default sum(max_count)を取り除く必要があります。列を追加した結果として、テーブルをバッキングするファイルへの変更は発生しません。 HiveはNULLをその列のすべてのセルの値として解釈することにより、「欠落」データを処理します

そのため、列にデータを入力する必要があるという問題があります。残念ながら、Hiveでは、基本的にテーブル全体を書き換える必要がありますが、今回は列が設定されています。新しい列を使用して元のクエリを再実行する方が簡単な場合があります。または、現在のテーブルに列を追加してから、すべての列と新しい列の値を選択できます。

また、列を常に希望するデフォルトにCOALESCEし、NULLのままにするオプションもあります。 NULLに目的のデフォルトとは異なる意味を持たせたい場合、このオプションは失敗します。また、常にCOALESCEを記憶することに依存する必要があります。

Hiveをサポートするファイルを処理する能力に自信がある場合は、それらを直接変更してデフォルトを追加することもできます。ほとんどの場合、それはより遅く、より危険になるので、一般的にはこれに対してお勧めします。しかし、それが理にかなっているケースがあるかもしれないので、完全性のためにこのオプションを含めました。

40
Daniel Koverman