0

我想对其中包含多个文件的多个目录运行计数配置单元查询。文件路径如下所示

'2011/01/01/file20110101_01.csv
 2011/01/01/file20110101_02.csv
 2011/01/02/file20110201_01.csv
 2011/01/02/file20110201_02.csv'

等等。

我创建了一个具有以下分区的外部表

 'create external table table1(col1,col2...)
  partitioned by (year string,month string)
  STORED AS TEXTFILE'

并尝试将分区添加到该月。

'ALTER TABLE partition_test_production1 ADD PARTITION(year='2011', month='01')
LOCATION 'blob path/2011/01/*/file201101*.csv';'

试过这个查询

'select count(1) from table1 where year='2011' AND month='01';'

但计数显示为零。关于如何做到这一点的任何建议?

4

2 回答 2

0

您实际上并不需要手动创建分区。如果您已经创建了一个外部表并且数据驻留在此目录中,您可以运行msck 修复表 table_name,它会自动加载所有分区。

于 2014-09-26T13:07:48.143 回答
0

您不必单独添加所有文件,但您必须单独添加所有底层目录。添加目录时,Hive 会读取该目录中的所有文件,但不会读取子目录中的任何文件。例如:

create external table table1(col1,col2...)
partitioned by (year string, month string, day string)
STORED AS TEXTFILE

ALTER TABLE table1 ADD PARTITION(year='2011', month='01', day='01')
LOCATION 'hdfs:///path/2011/01/01/';

ALTER TABLE table1 ADD PARTITION(year='2011', month='01', day='02')
LOCATION 'hdfs:///path/2011/01/02/';

etc

通常你会有一个 bash 脚本或其他东西来做这件事。遍历 hdfs 中的所有目录并生成 hive 语句以添加该分区。我不是 bash 专家,但举个例子:

hadoop fs -ls hdfs:///path/*/* | while read line; do
  year="$(echo "$line" | awk -F/ '{print $(NF-2)}')"
  month="$(echo "$line" | awk -F/ '{print $(NF-1)}')"
  day="$(echo "$line" | awk -F/ '{print $(NF)}')"
  hive -e "alter table table1 add partition(year='$year', month='$month', day='$day') location 'hdfs:///path/$year/$month/$day'"
done

似乎有一些关于让表/分区位置更灵活的旧 jira 票,但它们都没有得到解决。

于 2014-05-08T22:16:19.200 回答