【问题标题】:How to add partition using hive by a specific date?如何在特定日期使用 hive 添加分区?
【发布时间】:2019-05-30 02:26:59
【问题描述】:

我正在使用 hive(带有外部表)来处理存储在 amazon S3 上的数据。

我的数据分区如下:

                       DIR   s3://test.com/2014-03-01/
                       DIR   s3://test.com/2014-03-02/
                       DIR   s3://test.com/2014-03-03/
                       DIR   s3://test.com/2014-03-04/
                       DIR   s3://test.com/2014-03-05/

s3://test.com/2014-03-05/ip-foo-request-2014-03-05_04-20_00-49.log
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_06-26_19-56.log
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_15-20_12-53.log
s3://test.com/2014-03-05/ip-foo-request-2014-03-05_22-54_27-19.log

如何使用hive创建分区表?

   CREATE EXTERNAL TABLE test (
    foo string,
    time string,
    bar string
    )  PARTITIONED BY (? string)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\t'
    LOCATION 's3://test.com/';

有人可以回答这个问题吗?谢谢!

【问题讨论】:

    标签: hadoop amazon-s3 hive


    【解决方案1】:

    首先从正确的表定义开始。在你的情况下,我只会使用你写的:

    CREATE EXTERNAL TABLE test (
        foo string,
        time string,
        bar string
    )  PARTITIONED BY (dt string)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\t'
    LOCATION 's3://test.com/';
    

    默认情况下,Hive 期望分区位于通过约定 s3://test.com/partitionkey=partitionvalue 命名的子目录中。例如

    s3://test.com/dt=2014-03-05
    

    如果您遵循此约定,您可以使用 MSCK 添加所有分区。

    如果您不能或不想使用此命名约定,则需要添加所有分区,如下所示:

    ALTER TABLE test
        ADD PARTITION (dt='2014-03-05')
        location 's3://test.com/2014-03-05'
    

    【讨论】:

    • 上述查询运行正常,没有任何语法错误。但不加载任何数据。输出为 0 字节。你能帮帮我吗?
    • ALTER TABLE px_logs 添加分区 (ds=date_sub('${DAY}', 1));当我尝试使用 python 代码获取当前日期时也出现错误:FAILED: Parse Error: line 3:38 cannot identify input 'date_sub' in constant
    • 感谢您发布此信息。很有帮助。
    • @brisk 我遇到了同样的问题,没有加载任何内容,metastore 告诉我位置仍然有 dt= 样式,这不是我们在 ALTER 中设置的。你现在有什么想法了吗?
    • 文件以上述分区格式存在后使用MSCK REPAIR TABLE table_name;,以便一次性自动添加分区!
    【解决方案2】:

    如果您现有的目录结构不符合<partition name>=<partition value>,您必须手动添加分区。除非您像这样构建目录,否则 MSCK REPAIR TABLE 将不起作用。

    在您指定创建表的位置后,例如:

    创建外部表测试( foo 字符串, 时间字符串, 条弦 ) 分区(dt 字符串) 行格式分隔 由“\t”终止的字段 位置's3://test.com/';

    您可以在不指定完整路径的情况下添加分区:

    ALTER TABLE test ADD PARTITION (dt='2014-03-05') LOCATION '2014-03-05';
    

    虽然我从未检查过,但我建议您将分区移动到存储桶内的文件夹中,而不是直接在存储桶本身中。例如。从s3://test.com/s3://test.com/data/

    【讨论】:

      【解决方案3】:

      如果您要使用日期字段进行分区,您需要如下所述的 s3 文件夹结构:

      s3://test.com/date=2014-03-05/ip-foo-request-2014-03-05_04-20_00-49.log
      

      在这种情况下,您可以创建分区列为 date 的外部表 并运行 MSCK REPAIR TABLE EXTERNAL_TABLE_NAME 来更新 hive 元存储。

      【讨论】:

      • CREATE EXTERNAL TABLE test (foo string, time string, bar string) PARTITIONED BY (date string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' LOCATION 3://test.com/'; MSCK 修复表测试;我运行了这个脚本。它不会从 s3 加载数据。在上面给出的 s3 路径中有很多日志文件。如何使用 MSCK REPAIR TABLE?。
      • 你能把你的 s3 文件夹的输出贴出来
      【解决方案4】:

      请查看 Carter Shanklin 上面发布的回复。您需要确保您的文件以 partitionkey=partitionvalue 的形式存储在目录结构中,即 Hive 默认情况下期望分区位于通过约定命名的子目录中。

      在您的示例中,它应该存储为

      s3://test.com/date=20140305/ip-foo-request-2014-03-05_04-20_00-49.log。

      要遵循的步骤:

      i) 确保数据存在于上述结构中 ii) 创建外部表 iii) 现在运行 msck 修复表。

      【讨论】:

        【解决方案5】:

        我认为数据存在于 s3 位置,并且可能不会在元数据 (emrfs) 中更新。为了这个工作首先做 emrfs 导入和 emrfs 同步。 然后应用 msck 修复。

        它将添加 s3 中存在的所有分区

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-03-09
          • 2016-08-12
          • 2016-04-12
          • 1970-01-01
          • 1970-01-01
          • 2015-10-07
          • 1970-01-01
          相关资源
          最近更新 更多