1

Hive の動的パーティションを使用していますが、新しいパーティションを追加しない限り列にデータが入力されないという問題があります。デモ用に小さなデモ例を作成しました。

1. (年 int、月 int、日 int) で分割されたテーブルの野菜 (name string、count bigint) を作成します。
2. 外部テーブル dataForVeg (name string、count bigint、weight string、year int、month int、day int) を作成します。' ' で終了する行形式の区切りフィールド。
3. data1 を dataforveg にロードする
4. hive.exec.dynamic.partition.mode=nonstrict を設定します。
5. テーブルの野菜パーティション (年、月、日) に挿入します。dataforveg から名前、カウント、年、月、日を選択します。

6. hive> select * from vegetables where day='5';
トマト 5 2013 11 5
キャベツ 3 2013 11 5

7. hive> alter table vegetables add columns(weight double);
8. hive> 野菜について説明します。
名前文字列
bigint を数える
体重倍増
年整数
月の整数
日の整数

9. hive> select * from vegetables where day='5';
トマト 5 NULL 2013 11 5
キャベツ 3 NULL 2013 11 5

hive> select * from vegetables where day='4';
じゃがいも 2 NULL 2013 11 4

10. 上書き data2 を dataforveg にロードします。
11. hive> select * from dataforveg;
ニンジン 10 5 2013 11 5
コショウ 15 2 2013 11 5

12. hive> select * from vegetables where day='5';
トマト 5 NULL 2013 11 5
キャベツ 3 NULL 2013 11 5
にんじん 10 NULL 2013 11 5
コショウ 15 NULL 2013 11 5

13.上書きデータ3をdataforvegにロード
ハイブ > dataforveg から * を選択します。
ビート 4 1 2013 11 6
ブロッコリー 3 1 2013 11 6

14. ハイブ> 野菜から * を選択;
じゃがいも 2 NULL 2013 11 4
トマト 5 NULL 2013 11 5
キャベツ 3 NULL 2013 11 5
にんじん 10 NULL 2013 11 5
コショウ 15 NULL 2013 11 5
ビート 4 1.0 2013 11 6
ブロッコリー 3 1.0 2013 11 6

例からわかるように、新しいパーティションを追加するとデータが更新されます。質問: 手順 12 でニンジンとコショウの新しいフィールド「重量」の値を更新する方法はありますか? つまり、新しく追加された列を既存のパーティションのデータで埋める方法はありますか?

4

1 に答える 1

1

基盤となるファイル システムである HDFS は、ファイルの更新や追加さえもサポートしていません。この状況での唯一のオプションは、古いパーティションのデータを新しい列の値とマージし、そのパーティションのファイルをその MapReduce ジョブの出力で置き換える MapReduce ジョブを作成することです。

MapReduce ジョブを作成することに興味がない場合は、おそらく Hive CTAS (選択としてテーブルを作成) と HDFS 操作を組み合わせたものをリギングできます。

于 2013-11-06T18:54:55.483 に答える