2

次のようにデータがロードされたテーブルがあります。

create table xyzlogTable (dateC string , hours string, minutes string, seconds string, TimeTaken string, Method string, UriQuery string, ProtocolStatus string) row format serde 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' with serdeproperties( "input.regex" = "(\\S+)\\t(\\d+):(\\d+):(\\d+)\\t(\\S+)\\t(\\S+)\\t(\\S+)\\t(\\S+)", "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s") stored as textfile;

load data local inpath '/home/hadoop/hive/xyxlogData/' into table xyxlogTable;

行数の合計は 300 万を超えています。正常に動作するクエリもあれば、無限ループに陥るクエリもあります。

select , group byクエリに時間がかかり、結果が返されないこともあるため、パーティショニングを行うことにしました。

ただし、次のステートメントは両方とも失敗しています。

create table xyzlogTable (datenonQuery string , hours string, minutes string, seconds string, TimeTaken string, Method string, UriQuery string, ProtocolStatus string) partitioned by (dateC string); 

FAILED: メタデータのエラー: AlreadyExistsException(message:Table xyzlogTable already exists) FAILED: 実行エラー、org.apache.hadoop.hive.ql.exec.DDLTask からの戻りコード 1

Alter table xyzlogTable (datenonQuery string , hours string, minutes string, seconds string, TimeTaken string, Method string, UriQuery string, ProtocolStatus string) partitioned by (dateC string);

失敗: 解析エラー: 行 1:12 は、alter table ステートメントの入力 'xyzlogTable' を認識できません

問題は何ですか?

4

2 に答える 2

7

これこそまさに、私が Hive で外部テーブルを使用することを好む理由です。作成したテーブルは外部ではありません (create tableの代わりに使用しましたcreate external table)。非外部テーブルでは、テーブルを削除すると、メタデータ (名前、列名、型など) と HDFS 内のテーブルのデータが削除されます。逆に、外部テーブルが削除されると、メタデータのみが削除され、HDFS 内のデータは残ります。

今後、いくつかのオプションがあります。

  1. インポートのコストが高く、データがまだ分割されていない場合。このテーブルは保持しますが、このテーブルのパーティション バージョンとなる xyzlogTable_partitioned という新しいテーブルを作成します。Hive で動的パーティショニングを使用して、この新しいテーブルにデータを入力できます。

  2. インポートのコストが高いが、データが既に分割されている場合。たとえば、HDFS のパーティションごとに個別のファイルにデータが既にあるとします。新しいパーティション分割されたテーブルを作成し、bash スクリプト (または同等のもの) を使用して、パーティション分割されていないテーブルに対応する HDFS ディレクトリから新しいテーブルの適切なパーティションに対応するディレクトリに移動 (または保守的な場合はコピーして後で削除) します。テーブル。

  3. インポートが安価な場合: テーブル全体を削除します。新しい分割テーブルを再作成し、再インポートします。多くの場合、インポート プロセスがパーティショニング スキーマを認識していない場合 (つまり、インポートでデータを適切なパーティションに直接プッシュできない場合)、パーティション化されていないテーブル (既にあるテーブルなど) を使用するのが一般的なユース ケースです。ステージング テーブルとして作成し、Hive クエリまたは動的パーティション分割を使用して、ワークフローの後続のクエリで使用される新しいパーティション テーブルにデータを入力します。

于 2012-12-10T22:51:51.327 に答える
1

まず、既に作成されているテーブルを削除してから、パーティション分割されたテーブルを作成する必要があります。または、テーブル名を変更してください。

于 2012-12-10T12:06:32.043 に答える