【问题标题】:Hive date based partitions基于 Hive 日期的分区
【发布时间】:2015-10-07 20:33:40
【问题描述】:

我在 HDFS 上有以下形式的数据:-

/basedir/yyyymmdd/fixedname/files

yyyymmdd 是日期文件夹,files 是添加到目录中的文件列表。我需要一个表来从 yyyymmdd/fixedname 目录中获取数据。当我添加新日期时,这也应该有效。例如我在 2013 年 3 月 5 日添加了一些内容,因此当天添加的所有文件都将转到 20130305/fixedname 文件夹。 2013 年 3 月 6 日,所有文件将进入 20130306/fixedname 文件夹。

如何更改配置单元表以从更改日期获取数据但其中固定文件夹?

【问题讨论】:

    标签: date hive partition


    【解决方案1】:

    您有分区表吗?假设您已经有一个按列 date 分区的表,并且您想要添加新数据。在这种情况下,您必须将数据添加到新目录并告诉 hive 表(特别是元存储)它有一个使用 ALTER TABLE ADD PARTITION COMMAND 的新分区。

    假设您还没有创建任何表。在这种情况下,您必须先create a partitioned table,然后再insert the data into this table from queries。当你设置这两个标志时,魔法就会出现:

    set hive.exec.dynamic.partition=yes
    set hive.exec.dynamic.partition.mode = nonstrict;
    

    这些标志允许动态分区(更多详情请阅读here)。

    请记住,您将拥有如下目录:

    /date=YYYYMMDD/fixedname/files
    

    因此,您必须告诉 Hive 以递归方式将所有数据提取到子目录中。您应该设置以下标志 (here there is a better explanation)

    SET mapred.input.dir.recursive=true;
    

    最后,您将能够按日期进行查询,并从您在查询中指定的日期 (/date=YYYYMMDD/...) 获取子目录中的所有数据。

    希望这对您有所帮助。

    【讨论】:

    • 我创建了分区表,例如“创建由(日期字符串)位置'/basedir'分区的外部表(...,..)。之后我手动创建了文件夹 basedir/date=YYYYMMDD /fixedname/ 并复制了一个与表结构匹配的文件。但是,当我从表中选择 * 时,我看不到其中的任何内容。
    • 您好@Karan,您是否将标志 mapred.input.dir.recursive 设置为 true?另外,想想 basedir ... 真的有必要拥有那个文件夹吗?因为分区的想法是在第一级拆分数据。请告诉我你是如何定义你的表的,你的文件是怎样的。
    • 赞成。该标志设置为真。拥有 basedir 是一项要求,因此我无法更改。该表的定义类似于 CREATE EXTERNAL TABLE IF NOT EXISTS tableName (list of columns) PARTITIONED BY (date String) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION 'basedir/tableName/' 然后在 hdfs 上,我有 basedir/表名/2015-07-17。所有文件都在日期文件夹中。这些文件具有由“\t”分隔的字段。上面的目录结构与我最初提出的问题不同,因为我必须更改它。
    • 完美,没错。我想我明白你的问题是什么。您是否像“basedir/tableName/2015-07-17”一样定义您的目录结构?您应该将其更改为“basedir/tableName/date=2015-07-17”。然后运行命令“MSCK REPAIR TABLE NAME_OF_YOUR_TABLE;”。试试看,告诉我这是怎么回事。
    • 这样可行,但我不得不手动说“alter table tableName add partition (date='2015-07-17') location '/basedir/tableName/date=2015-07-17';所以每次有一个新的日期目录时,我都需要执行 alter table 命令?我的 hive.exec.dynamic.partition.mode 仍然设置为严格,因为我没有修改它。这是每个用户的设置还是会影响所有用户都使用同一个 Hive 服务器?我不想破坏其他人的代码。
    猜你喜欢
    • 2015-04-29
    • 2016-08-12
    • 2017-08-28
    • 2021-04-05
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多