【问题标题】:Hive - set partitioning of external table based on file pathHive - 根据文件路径设置外部表的分区
【发布时间】:2016-03-29 09:16:38
【问题描述】:

我的工作是按照以下格式将文件写入 hdfs:

/table_name/yyyy/MM/dd/HH/mm/ss/file_name.avro

是否可以在不移动文件和重命名目录的情况下定义同时按年份和时间戳 (HH:mm:ss) 分区的 Hive 外部表?

【问题讨论】:

    标签: hive hdfs datetime-format hiveql


    【解决方案1】:

    您可以通过为每个 yyyy/HH/mm/ss 实例编写加载数据语句来实现这一点。

    LOAD DATA INPATH '/table_name/yyyy/MM/dd/HH/mm/ss/file_name.avro' INTO TABLE tablename PARTITION (year=yyyy, hour=HH, minute=mm, second=ss)
    

    【讨论】:

    • 我能以某种方式将小时、分钟和秒连接成一列吗?
    • 如果你将分区列定义为字符串类型,当然。
    • 在连接的情况下,当您想在第二个字段上进行通配符搜索时,您应该使用分区过滤器,例如使用 %。例如 select * from tablename where my_part like 'HH_mm_%'。此外,丢弃可能是一个问题。你不能写这样的语句:drop partition (my_part like 'HH_mm_%')。您应该每秒写入 drop partition (my_part='HH_mm_ss')。
    • 酷,它有效。还有一个问题 - 其中一些路径可能会更新(另一个 avro 文件可能会到达相同的 hh:mm:ss)是否有一种通用的方法可以在之后添加新文件(如使用 msck 修复表)并避免加载相同的数据两次?
    • 使用这个添加一个目录作为分区:ALTER TABLE table_name ADD PARTITION partition(tstamp='yyyy_hh_mm_ss') LOCATION '/table_name/yyyy/MM/dd/HH/mm/ss'
    猜你喜欢
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    • 2013-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多