Hive - 是不是必须将“=”外部表视为分区
Posted
技术标签:
【中文标题】Hive - 是不是必须将“=”外部表视为分区【英文标题】:Hive - Is it mandatory to have '=' for external table to consider as partitionHive - 是否必须将“=”外部表视为分区 【发布时间】:2020-07-08 03:19:36 【问题描述】:我是 Hive 新手,有以下基本问题:
我正在尝试在位置的 HDFS 目录上创建外部表
/projects/score/output/scores_2020-06-30.gzip
但它不将其视为分区。
开发人员是否需要更改目录名称“scores=yyyy-mm-dd”代替“scores_yyyy-mm-dd.gzip” 像“/projects/score/output/scores=2020-06-30” 那么只有它会被认为是分区的?
即外部表是否必须有'='才能视为分区
或者我可以在创建时更改下表中的内容。尝试如下:
CREATE EXTERNAL TABLE IF NOT EXISTS XYZ (
...
)
PARTITIONED BY (scores STRING)
LOCATION '/projects/score/output/';
提前致谢!
【问题讨论】:
【参考方案1】:您可以在任何位置的顶部定义分区,甚至使用ALTER TABLE ADD PARTITION
在表目录之外定义分区。 HDFS 中的分区是通常在表位置内的目录,但不一定。如果在表目录内,则可以使用msck repair table
将表目录内现有的子目录附加为分区,它会扫描表位置并添加分区元数据。
在您的示例分区目录中丢失,您只有表目录,里面有一个文件。在这种情况下,文件名无关紧要。
分区目录并非绝对强制必须采用 key=value 格式,尽管 msck repair table
可能无法在您的 Hive 发行版中工作,但您仍然可以使用 ALTER TABLE ADD PARTITION ... LOCATION
命令在任何目录之上添加分区。
这可能取决于供应商。例如,在 Qubole 上,ALTER TABLE RECOVER PARTITIONS(EMR 替代 MSCK REPAIR TABLE)适用于像“2020-06-30”这样的目录。
默认情况下,使用动态分区插入数据时,它会以 key=value 格式创建分区文件夹,但如果您使用其他工具创建分区目录,则可以使用“value”作为分区文件夹名称。只需检查 MSCK REPAIR 是否适用于您的情况。如果没有,如果您需要 MSCK REPAIR,请创建目录 key=value。
在这种情况下,文件名和分区文件夹中的文件数无关紧要。
【讨论】:
所以你的意思是说首先我可以创建没有分区的表,然后我可以更改表,如 ALTER TABLE ADD XYZ PARTITION ('scores_2020-06-30.gzip') LOCATION "/projects/score /输出/”;我非常怀疑它会起作用。但会检查和更新。 @ShaanGreat 当您在某个目录之上创建分区表时,不会自动创建分区。您需要ALTER TABLE ADD PARTITION ... LOCATION ...
或MSCK REPAIR TABLE
,msck repair 将查找表位置内的所有目录并为这些目录创建分区以上是关于Hive - 是不是必须将“=”外部表视为分区的主要内容,如果未能解决你的问题,请参考以下文章