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 吗?我的结论是它与桌子的大小有关。日志文件为 160 MB,在 Hive 中生成的表有 800 万行。如果我尝试为自己创建一个较小的文件并将其加载到 Hive,它将起作用。

知道出了什么问题吗?

编辑:我忘了说它使用小型实例在 Amazon Elastic MapReduce 上运行。

4

1 回答 1

0

我发现了问题。这真的不是 Hive 问题。我使用 Hadoop 作业的输出作为输入,在该作业中,我将输出写入键中,将值保留为空字符串:

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

问题是Hadoop默认在键和值之间插入一个制表符,并且由于字段是一个字符串,它也采用了制表符,所以我在每一行都有一个尾随制表符。我使用 Pig 发现了它,因为它包含带有 () 的输出。

我的解决方案是将分隔符设置为另一个字符,因为我只有两个字段,我在键中写入一个,在值中写入另一个,并将分隔符设置为“,”:

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

也许可以在 Hive 中修剪这些东西。

于 2012-07-06T09:43:36.323 回答