HDFS で Hive クエリの出力を保存しようとしましたが、データが変更されました。何か案が?
以下のデータと変更されたデータを参照してください。ファイル名の前のスペースを削除してください:)
[[正]: i.stack.imgur.com/DLNTT.png
[[めちゃめちゃ]: i.stack.imgur.com/7WIO3.png
フィードバックをいただければ幸いです。
前もって感謝します。
利用可能な複合型の 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 を使用する理由を説明します。