1

HDFS で Hive クエリの出力を保存しようとしましたが、データが変更されました。何か案が?

以下のデータと変更されたデータを参照してください。ファイル名の前のスペースを削除してください:)

[[正]: i.stack.imgur.com/DLNTT.png

[[めちゃめちゃ]: i.stack.imgur.com/7WIO3.png

フィードバックをいただければ幸いです。

前もって感謝します。

4

1 に答える 1

0

利用可能な複合型の 1 つである配列を Hive にインポートしているようです。内部的に、Hive は配列内の要素を ASCII 文字 002 で区切ります。ASCIIテーブルを調べると、これが印刷できない文字「テキストの開始」であることがわかります。端末が実際に印刷できない文字を印刷しているように見えます。2 つの画像を比較すると、配列のすべての項目が 002 で区切られていることがわかります。

同様に、Hive は行内のすべての列を ASCII 001 で区切り、マップ キー/値と構造フィールド/値を ASCII 003 で区切ります。これらの値は、データに表示される可能性が低いため選択されました。これを変更したい場合は、create table statement で ROW FORMAT を使用して区切り文字を手動で指定できます。ただし、コレクション アイテム ターミネータを次のようなものに切り替えると,、入力内のカンマが Hive のコレクション ターミネータのように見えることに注意してください。

データを人間が読める形式で保存する必要がなく、ターミネーターと衝突しない印刷可能な文字があることが確実でない限り、そのままにしておきます。HDFS ファイルを読み取る必要がある場合は、いつでもhadoop fs -cat /exampleWarehouseDir/exampleTable/* | tr '\002' '\t'タブで区切られた配列アイテムを表示できます。Hive テーブルに対して MapReduce または Pig ジョブを作成する場合は、区切り文字に注意してください。MapReduce から Hive テーブルを読み書きする方法を学ぶことで、これらのターミネーターについて最初に学びましまた、すべての処理を Hive で行っている場合は、ターミネーターが何であるかについて心配する必要はありません (入力データにターミネーターが表示されない限り)。

これで、HDFS からファイルの内容を読み取っている場合に ASCII 002 がポップアップ表示される理由が説明されますが、コレクション ターミネータを認識している必要がある (したがって、それらを使用する) Hive コマンド ライン インターフェイスから表示されているようです。それらを印刷する代わりに、配列の要素を分離します)。私の最善の推測では、スキーマを間違って指定しており、テーブルresultsの列は、配列にするつもりだった文字列です。これは、コレクション ターミネータとして使用する代わりに ASCII 002 を使用する理由を説明します。

于 2013-03-20T16:09:42.697 に答える