我想在多个目录中运行count hive查询,这些目录中包含多个文件。文件路径如下所示
'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';'
但计数显示为零。有关如何做到这一点的任何建议吗?
答案 0 :(得分: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门票,但它们都没有解决。
答案 1 :(得分:0)
您真的不需要手动创建分区。如果您已创建外部表并且数据驻留在此目录中,则可以运行 msck修复表table_name ,它将自动加载所有分区。