1

フィールドを持ついくつかのログデータがあります

  1. ID、日付、情報

動的パーティション テーブルを作成しました

CREATE TABLE log_partitioned(id STRING,  info STRING)
PARTITIONED BY ( tdate STRING) 

そして、データをロードしています

FROM logs lg
INSERT OVERWRITE TABLE log_partitioned PARTITION(tdate)
SELECT lg.id, lg.info, lg.tdate
DISTRIBUTE BY tdate;

動的パーティショニングによってデータを正常にロードしています。しかし、データを見ようとすると

hdfs dfs -cat /user/hive/warehouse/log_partitioned/tdate=2000-11-05/part-r-00000

列の値は 2 つしかありません。

  • id1、info1

  • id2、info2 ....

ハイブクエリを実行すると

select * from log_partitioned limit 10

3 つの列すべてが表示されています。ハイブが基になるデータにパーティション列も格納するにはどうすればよいですか?

4

1 に答える 1

2

ハイブがデフォルトでこれをまったく行わないことはかなり確信しています。カスタムの SerDe や Input/OutputFormat を使用して実現できる場合もありますが、注意が必要です。問題は、誰でもこれらのパーティション フォルダーにデータを配置できることです。その列に間違った値を含むデータを配置した場合、Hive はそれをどのように調整しますか?

これのユースケースは何ですか?dfs -catあなたが話していたコマンドを実行している場合、渡されたパスから tdate は明らかではありませんか? シェルコマンドの出力で本当にそれが必要な場合は、次のようになります。

dfs -cat /foo/bar/tdate=2000-11-05/part-r-00000 | sed -e 's/$/  2000-11-05/'

別の回避策として、テーブルの 2 つの列に同じデータを格納することもできます。このような:

CREATE TABLE log_partitioned(id STRING, info STRING, tdate_1 STRING)
PARTITIONED BY (tdate_2 STRING);

FROM logs lg
INSERT OVERWRITE TABLE log_partitioned PARTITION(tdate)
SELECT lg.id, lg.info, lg.tdate as tdate_1, lg.tdate as tdate_2
DISTRIBUTE BY tdate_2;
于 2013-10-02T17:55:17.793 に答える