我有一些我想用Hive查询的Web服务器日志.HDFS中的目录结构如下所示:
/data/access/web1/2014/09 /data/access/web1/2014/09/access-20140901.log [... etc ...] /data/access/web1/2014/10 /data/access/web1/2014/10/access-20141001.log [... etc ...] /data/access/web2/2014/09 /data/access/web2/2014/09/access-20140901.log [... etc ...] /data/access/web2/2014/10 /data/access/web2/2014/10/access-20141001.log [... etc ...]
我能够创建一个外部表:
CREATE EXTERNAL TABLE access( host STRING, identity STRING, user STRING, time STRING, request STRING, status STRING, size STRING, referer STRING, agent STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' WITH SERDEPROPERTIES ( "input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|\\[[^\\]]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\"[^\"]*\") ([^ \"]*|\"[^\"]*\"))?", "output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s") LOCATION '/data/access/'
...虽然Hive不会进入子文件夹,除非我在运行Hive查询之前运行以下命令:
set hive.input.dir.recursive=true; set hive.mapred.supports.subdirectories=true; set hive.supports.subdirectories=true; set mapred.input.dir.recursive=true;
我已经看到其他帖子在表级设置这些属性(例如,使用tblproperties创建Hive外部表的问题):
TBLPROPERTIES ("hive.input.dir.recursive" = "TRUE", "hive.mapred.supports.subdirectories" = "TRUE", "hive.supports.subdirectories" = "TRUE", "mapred.input.dir.recursive" = "TRUE");
不幸的是,这对我不起作用:当我查询表时,表不会返回任何记录.我知道可以在hive-site.xml中设置这些属性,但如果我不需要,我宁愿不做任何可能影响其他用户的更改.
问)有没有办法创建一个表,该表下降到子目录而不使用分区,进行站点范围的更改,或每次运行这4个命令?
在HDInsight中使用Hive,我在Hive查询中创建外部表之前设置了以下属性,它对我有用.
SET hive.mapred.supports.subdirectories=TRUE; SET mapred.input.dir.recursive=TRUE;