11

次のようなファイル パスに HDFS の Avro 形式のデータがあります/data/logs/[foldername]/[filename].avro。これらすべてのログ ファイル、つまりフォームのすべてのファイルに対して Hive テーブルを作成したいと考えています/data/logs/*/*。(それらはすべて同じ Avro スキーマに基づいています。)

flag を使用して以下のクエリを実行していますmapred.input.dir.recursive=true

CREATE EXTERNAL TABLE default.testtable
  ROW FORMAT SERDE
  'org.apache.hadoop.hive.serde2.avro.AvroSerDe'
  STORED AS INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat'
  OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat'
  LOCATION 'hdfs://.../data/*/*'
  TBLPROPERTIES (
    'avro.schema.url'='hdfs://.../schema.avsc') 

LOCATIONネストを少なくする、つまり'hdfs://.../data/[foldername]/'特定のフォルダー名に変更しない限り、テーブルは空になります。これは、 のネストされていないパスで問題なく機能しましたLOCATION

これらすべての異なる [foldername] フォルダーからデータを取得できるようにしたいと考えています。ネストされたディレクトリで再帰的な入力選択をさらに進めるにはどうすればよいですか?

4

2 に答える 2

5

次の Hive 設定を使用して、再帰的なディレクトリを有効にします。

set hive.mapred.supports.subdirectories=TRUE;
set mapred.input.dir.recursive=TRUE;

外部テーブルを作成し、ルート ディレクトリを場所として指定します。

LOCATION 'hdfs://.../data'

テーブルの場所とすべてのサブディレクトリからデータをクエリできます

于 2017-05-05T12:27:25.523 に答える
1

問題を解決する方法の 1 つは、フォルダー名をパーティション列として外部テーブルに追加することです。次に、データ ディレクトリで作成しているように、テーブルを作成できます。または、これらのネストされたファイルを取得して、単一のディレクトリにフラット化することもできます。

そうでなければ、これらすべてのフォルダーの入力を1つのテーブルと見なすようにハイブに依頼することはできないと思います。

この質問は同様の問題に対処しているようです: ハイブで外部テーブルを作成するときに、ディレクトリ内の特定のファイルを指すことができますか?

同じコンテキストで公開されている Jira の問題があります: https://issues.apache.org/jira/browse/HIVE-951

もっとブラウジングして、代替として SimlinkInputTextFormat を使用することを提案するこの投稿を見ました。これがあなたの Avro フォーマットでうまくいくかどうかはわかりません。 https://hive.apache.org/javadocs/r0.10.0/api/org/apache/hadoop/hive/ql/io/SymlinkTextInputFormat.html

于 2014-12-11T03:03:13.927 に答える