12

読み込んでいるファイルは ' ' (空白) で区切られています。以下はファイルです。ファイルは HDFS にあります:-

001 000
001 000
002 001
003 002
004 003
005 004
006 005
007 006
008 007
099 007

1> 外部テーブルを作成し、以下のコマンドを発行してファイルをロードしています:-

CREATE EXTERNAL TABLE IF NOT EXISTS graph_edges (src_node_id STRING COMMENT 'Node ID of Source node', dest_node_id STRING COMMENT 'Node ID of Destination node') ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' STORED AS TEXTFILE LOCATION '/user/hadoop/input';

2>この後、次のコマンドを発行して、テーブルを別のファイルに挿入するだけです:-

INSERT OVERWRITE DIRECTORY '/user/hadoop/output' SELECT * FROM graph_edges;

3>ファイルをcatすると、フィールドは区切り文字で区切られません:-

hadoop dfs -cat /user/hadoop/output/000000_0

出力:-

001000
001000
002001
003002
004003
005004
006005
007006
008007
099007

誰か助けてくれませんか?区切り文字が削除される理由と、出力ファイルを区切る方法を教えてください。

CREATE TABLE コマンドで試しDELIMITED BY '\t'ましたが、不要な NULL 列を取得しています。

どんなポインタでも大歓迎です。Hive 0.9.0 バージョンを使用しています。

4

10 に答える 10

11

concat_ws 関数を使用すると、出力を達成できると思います。

INSERT OVERWRITE DIRECTORY '/user/hadoop/output' SELECT concat_ws(',', col1, col2) FROM graph_edges;

ここでは、列区切り文字としてコンマを選択しました

于 2013-06-28T06:36:59.910 に答える
4

なんか声が違う。

実際、Hive はカスタム区切り文字をサポートしていません。

ただし、 を使用するINSERT OVERWRITE DIRECTORYと、行に区切り文字が含まれます。区切り文字は'\1'.

を使用hadoop dfs -cat $file | head -1 | xxdして、ファイルを見つけたり、HDFS からローカル マシンにファイルを取得して、vim で開くことができます。あなたのvimには区切り文字である「^ A」のような文字があります。

質問に戻ると、簡単な方法で解決できます。

  1. まだINSERT OVERWRITE DIRECTORY '/user/hadoop/output'生成するために使用します/user/hadoop/output

  2. フィールドが で区切られた外部テーブルを作成'\1':

    create external table graph_out (src string, dest string) 
    row format delimited 
    fields terminated by '\1' 
    lines terminated by '\n' 
    stored as textfile location '/user/hadoop/output';
    
于 2013-05-09T16:07:03.827 に答える
3

ディレクトリへの書き込み時に区切り文字を指定できます

INSERT OVERWRITE DIRECTORY '/user/hadoop/output'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY
SELECT * FROM graph_edges;

これはうまくいくはずです。

于 2014-09-24T04:08:06.333 に答える
1

ハイブクエリ結果の出力をパイプで区切る必要があるというこの問題がありました..このsedコマンドを実行すると、次のように置き換えることができます:^A to |

sed 's#\x01#|#g' test.log > piped_test.log

于 2014-07-28T14:16:15.957 に答える
0

これは、達成するためのラウンドアバウトな方法ですが、より良い解決策になると思います。

INSERT OVERWRITE DIRECTORY '/user/hadoop/output' SELECT src_node_id,' ',dest_node_id FROM graph_edges;

于 2015-01-23T22:43:06.477 に答える
0

ハイブが実際には区切り文字として contol-A を書いているのではないかと思いますが、画面に猫を描いても目には見えません。

代わりに、vi でファイルを表示するか、ファイルの一部だけを見たい場合はファイルの先頭に移動して、vi で結果を確認してください。

hadoop dfs -cat /ユーザー/hadoop/output/000000_0 | 頭 > my_local_file.txt

vi my_local_file.txt

そこに ^A 文字が表示されるはずです。

于 2014-02-03T23:47:11.123 に答える
0

デフォルトのセパレータは"^A"です。Python 言語では"\x01"です。

区切り文字を変更したいときは、次のような SQL を使用します。

SELECT 列 1、区切り文字、列 2、区切り文字、列 3、...、FROM テーブル

次に、delimiter+"^A"を新しい区切り文字と見なします。

于 2013-11-06T22:20:39.853 に答える