Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在具有多个文件的多个目录上运行配置单元查询_Sql_Hadoop_Hive_Hiveql_Azure Hdinsight - Fatal编程技术网

Sql 如何在具有多个文件的多个目录上运行配置单元查询

Sql 如何在具有多个文件的多个目录上运行配置单元查询,sql,hadoop,hive,hiveql,azure-hdinsight,Sql,Hadoop,Hive,Hiveql,Azure Hdinsight,我想对包含多个文件的多个目录运行计数配置单元查询。文件的路径如下所示 '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 (ye

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

'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';'

但计数显示为零。有什么建议吗?

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

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中的所有目录,并生成配置单元语句以添加该分区。我不是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规则,但它们都没有解决。

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

是的,我确实像您提到的那样单独创建了每个分区。但我每个月都有第01天到第30天的子目录,在每个目录下都有多个文件。是否有一种方法可以使用一个查询包含所有这些日常目录。不,没有。我应该澄清一下——你必须单独添加所有的底层目录,所以在你的情况下,一直到今天。请注意,在我的示例中,我添加了一个day分区列,并添加了更深层次的目录。我正试图在microsoft azure hdinsight中实现这一点,而不是在HDFS中。我不能在这里运行shell脚本。我没有使用microsoft堆栈的经验,但您肯定可以运行某种脚本,即使它不是shell?您只需要能够以编程方式在目录上循环,并执行一些基本的文本操作,以将它们转换为add partition语句。当然,我们将对此进行研究。非常感谢。