2011-10-12 6 views
7

Hadoop/Hive初心者はこちら。私はハイブでカスタムテキストベースのフォーマットで保存されたデータを使用しようとしています。私の理解では、カスタムFileFormatまたはカスタムSerDeクラスを書くことができます。そうか、それとも私はそれを誤解していますか?どのオプションをいつ選択するのかに関する一般的なガイドラインは何ですか?ありがとう!FileFormatを使用する。v Serdeを使用してカスタムテキストファイルを読む。

答えて

11

に役立ちます願っています。結局serdeを書く必要はなく、カスタムRecordReader(実装org.apache.hadoop.mapred.RecordReader<K, V>)を返すカスタムInputFormat(extend org.apache.hadoop.mapred.TextInputFormat)を書きました。 RecordReaderは、ファイルを読み込んで解析し、タブで区切られた行を返すロジックを実装しています。それと

私はこれがネイティブSerDeを使用しています

create table t2 ( 
field1 string, 
.. 
fieldNN float)   
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t'  
STORED AS INPUTFORMAT 'namespace.CustomFileInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'; 

としての私のテーブルを宣言しました。また、カスタム入力形式を使用するときは出力形式を指定する必要があるため、組み込み出力形式の1つを選択します。

+0

あなたが持っているコードを共有したいですか? Java + hadoop newbieはここにあります。圧縮解除時に1行で圧縮されたときに改行があることがあるファイルを解凍しようとしています。 Hadoopはそれを改行で分割し、データが壊れてしまいます。私はハイブ用のプラグインを作ろうとしています。私はこれが古いスレッドだと知っていますが、尋ねなければなりません。ありがとう – Jeff

1

ハイブを使用している場合は、serdeと記入してください。次の例を参照してください。 https://github.com/apache/hive/tree/trunk/contrib/src/java/org/apache/hadoop/hive/contrib/serde2

このインターフェイスはハイブ固有であることに注意してください。通常のハープ・ジョブにカスタム・ファイル形式を使用する場合は、別のインタフェースを実装する必要があります(どちらが完全かはわかりません)。

データを別の言語で逆シリアル化する方法がわかっている場合は、(任意の言語を使用して)ストリーミングジョブを作成し、既存のライブラリを使用するだけです。

私はそれを考え出した

2

テキストファイルの内容によって異なります。

カスタムレコードリーダーを作成して、テキストログファイルを解析し、必要な方法で返すことができます。入力フォーマットクラスは、そのジョブを行います。このjarを使用してHiveテーブルを作成し、そのテーブルにデータをロードします。

SerDeについては、私は少し違った使い方をしています。 InputFormatとSerDeの両方を使用しています。前者は実際のデータを解析し、後者は実際のデータを表すメタデータに安定化させます。なぜ私はそれを行うのですか?私は自分のログファイルの行ごとにハイブテーブルに適切な列を作成したいと思うし、SerDeは私にとって完璧な解決策だと思う。

最終的に、それらのテーブルをそのまま保持したい、または保持している場合は、これらの2つをマップして、それらのテーブルからクエリを実行できるようにします。

私はClouderaブログの説明が好きです。

http://blog.cloudera.com/blog/2012/12/how-to-use-a-serde-in-apache-hive/

6

基本的にはSerDeと、いつなFileFormatを変更する方法を変更することの違いを理解する必要があります。公式ドキュメントから

:SerDeは何Hive SerDe

? 1.SerDeは、シリアライザとデシリアライザの略称です。 2.Hiveは、SerDe(およびFileFormat)を使用してテーブル行を読み書きします。 3.HDFSファイル - > InputFileFormat - > - >デシリアライザ - >行オブジェクト 4。行オブジェクト - >シリアライザ - > - > OutputFileFormat - > HDFSファイル

したがって、3番目と4番目の点が違いを明確に推測しています。 通常とは異なる方法でレコードを読みたい場合(レコードが '\ n'で区切られている場合)、カスタムのファイル形式(入出力)が必要です。 読んだレコードをカスタム方法で解釈したい場合は、SerDeをカスタマイズする必要があります。

よく使用される形式のJSONの例を考えてみましょう。

シナリオ1: 1つの行に1つのjsonレコードが含まれている入力jsonファイルがあるとします。 これで、読んだレコードを好きなように解釈するカスタムSerdeが必要になりました。 1行は1レコードとなるため、カスタム入力形式は不要です。

シナリオ2:あなたは1つのJSONレコードが複数行にまたがる入力ファイルを持っていて、それを読みたい場合は は今、それはあなたの最初の1つのJSONレコードに読み取るために、カスタム入力フォーマットを記述する必要があり 続いているとし、このjsonレコードを読み込むとCustom SerDeに行きます。

関連する問題