5

我有一个外部表,它从 HDFS 位置 (/user/hive/warehouse/tableX) 的所有文件中读取数据,并在 Hive 中创建了一个外部表。

现在,让我们假设对数据进行了一些预分区,并且所有以前的文件都以特定的命名约定 < dir_name >_< incNumber > 分布在几个目录例如

/user/hive/warehouse/split/
  ./dir_1/files...
  ./dir_2/files...
  ./dir_n/files...

如何创建另一个外部表来跟踪拆分文件夹中的所有文件?

我是否需要创建一个在每个子文件夹 (dir_x) 上分区的外部表?

同样为此,是否需要某种可以为每个子目录创建/添加分区的 Hive 或 shell 脚本?

4

2 回答 2

5

您必须创建一个由 dir_x 分区的外部表才能访问多个文件夹中的所有文件。

CREATE external TABLE sample_table( col1 string,
                                    col2 string,
                                    col3 string,
                                    col4 string)
PARTITIONED BY (dir string)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION '/user/hive/warehouse/split';

然后像将分区添加到常规分区表一样

ALTER TABLE sample_table ADD PARTITION(dir='dir_1')
LOCATION '/user/hive/warehouse/split/dir_1';
ALTER TABLE sample_table ADD PARTITION(dir='dir_2')
LOCATION '/user/hive/warehouse/split/dir_2';

这种方法会奏效。这种方法存在问题。如果将来某个时间您决定将新文件夹(例如 dir_100)添加到 hive 仓库路径,则必须删除并重新创建 sample_table 并使用 ALTER TABLE 语句再次将所有分区重新添加到sample_table 。我已经有大约 10 个月没有使用 hive 了,所以我不确定是否有更好的方法。如果这不是问题,您可以使用此方法。

于 2016-06-01T23:08:05.660 回答
2

一旦你有你的外部表并且你知道 hive 将创建的分区结构。您可以通过某些过程将数据文件加载到驱动器中(到预分区的文件夹中)。一旦预分区文件可用(根据配置单元已知的分区结构),您可以如下修复表。

hive> MSCK REPAIR TABLE sample_table; 

上述语句将自动将所有现有分区同步到现有 EXTERNAL TABLE "sample_table" 的 hive 元存储。

于 2019-01-31T06:47:48.043 回答