0

csvログファイルがあります。この文を使用してHiveにロードした後:

CREATE EXTERNAL TABLE iprange(id STRING, ip STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\,' STORED AS TEXTFILE LOCATION '/user/hadoop/expandediprange/';

次のような単純なクエリを実行したいと思います。

select * from iprange where ip="0.0.0.2";

しかし、私は空の結果を取得します。

HDFSでHiveを実行していますが、HBaseを使用する必要がありますか?私の結論は、それはテーブルのサイズと関係があるということです。ログファイルは160MBで、Hiveで生成されたテーブルには800万行があります。自分で小さなファイルを作成してHiveにロードしようとすると、機能します。

何が悪いのか考えていますか?

編集:小さなインスタンスを使用してAmazonElasticMapReduceで実行されていると言うのを忘れました。

4

1 に答える 1

0

問題を見つけました。それは実際にはハイブの問題ではありませんでした。Hadoopジョブの出力を入力として使用しており、そのジョブでは、値を空の文字列として残して、キーに出力を書き込んでいました。

context.write(new Text(id + "," + ip), new Text(""));

問題は、Hadoopがデフォルトでキーと値の間にタブ文字を挿入することです。また、フィールドは文字列であるため、タブも使用するため、すべての行に末尾のタブがあります。()で出力を含むPigを使用して発見しました。

私の解決策は、区切り文字を別の文字に設定することです。フィールドが2つしかないため、1つはキーに、もう1つは値に書き込み、区切り文字を「、」に設定します。

conf.set("mapred.textoutputformat.separator", ",");

たぶん、Hiveでこれらのものをトリミングすることは可能です。

于 2012-07-06T09:43:36.323 に答える