【问题标题】:Hadoop - Create external table from multiple directories in HDFSHadoop - 从 HDFS 中的多个目录创建外部表
【发布时间】:2016-10-01 09:38:52
【问题描述】:

我有一个外部表,它从 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 脚本?

【问题讨论】:

    标签: hadoop hive hdfs partitioning external-tables


    【解决方案1】:

    您必须创建一个由 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 了,所以我不确定是否有更好的方法。如果这不是问题,您可以使用这种方法。

    【讨论】:

    • 感谢您的回复。确实这是一个解决方案,问题是定期(例如每天)添加一个新目录 。因此,需要使用诸如读取 ./split 中所有目录的脚本之类的东西来重新创建表。不确定这是否非常有效或最好的解决方案。
    • @Algina 您可以编写一个 Oozie 脚本来执行此操作。 oozie 脚本将能够删除并重新创建表,并在有新条目时添加所有分区。
    【解决方案2】:

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

    hive> MSCK REPAIR TABLE sample_table; 
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-31
      • 1970-01-01
      • 2017-07-07
      • 2021-11-26
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多