我刚接触 hive ,有一个基本问题:
我正在尝试在位置处的hdfs目录上创建外部表
/projects/score/output/scores_2020-06-30.gzip
但它并不认为这是一种划分。
如果开发人员需要更改目录名“scores=yyyy-mm-dd”而不是“scores\u yyyy-mm-dd.gzip”,比如“/projects/score/output/scores=2020-06-30”,那么只有它才会认为是分区的?
i、 外部表必须有“=”作为分区吗
或者我可以在创建时更改下表中的内容。尝试如下:
CREATE EXTERNAL TABLE IF NOT EXISTS XYZ (
...
)
PARTITIONED BY (scores STRING)
LOCATION '/projects/score/output/';
提前谢谢!
1条答案
按热度按时间eyh26e7m1#
您可以在任何位置上定义分区,甚至在表目录之外也可以使用
ALTER TABLE ADD PARTITION
. hdfs中的分区通常是表位置内的目录,但不一定是。如果它在表目录中,那么可以使用msck repair table
要将表目录中现有的子目录作为分区附加,它将扫描表位置并添加分区元数据。在您的示例中,分区目录丢失,您只有一个包含文件的表目录。在这种情况下,文件名无关紧要。
不过,分区目录的格式key=value并不是绝对必需的
msck repair table
可能无法在您的配置单元发行版中工作,您仍然可以使用添加分区ALTER TABLE ADD PARTITION ... LOCATION
任何目录顶部的命令。这可能取决于供应商。例如,在qubole上,alter table recover partitions(msck repair table的emr替代品)可以很好地处理“2020-06-30”这样的目录。
默认情况下,使用动态分区插入数据时,它会以key=value的格式创建分区文件夹,但是如果使用其他工具创建分区目录,则可以使用“value”作为分区文件夹名称。只要检查一下你的情况下msck是否可以修复。如果没有,请在需要msck修复时创建directories key=value。
文件名和分区文件夹中的文件数在此上下文中并不重要。