【问题标题】:hive update lastAccessTime配置单元更新 lastAccessTime
【发布时间】:2020-07-07 18:10:11
【问题描述】:

我想在 hive 表上更新 lastAccessTime ,在网上谷歌之后,我得到了一个解决方案:

set hive.exec.pre.hooks = org.apache.hadoop.hive.ql.hooks.UpdateInputAccessTimeHook$PreExec; 

但如果我有两个数据库 A 和 B 的配置单元 sql:

 set hive.exec.pre.hooks = 
    org.apache.hadoop.hive.ql.hooks.UpdateInputAccessTimeHook$PreExec;
    use A;
    insert overwrite A.xxx
    select  c1,c2 from B.xxx;

蜂巢归还我

org.apache.hadoop.hive.ql.metadata.InvalidTableException(表不 找到 B.xxx

【问题讨论】:

    标签: hive


    【解决方案1】:

    要检索表的“LastAccessTime”,请通过 Hive shell 运行以下命令,将 [database_name] 和 [table_name] 替换为相关值。

        use [database_name];
        show table extended like '[table_name]';
    

    这将返回几个指标,包括自 Epoch 以来经过的毫秒数(而不是秒数)。要将该数字格式化为代表当前系统时区中那个时刻的时间戳的字符串,请从该数字中删除最后三位数字并通过以下命令运行它:

        select from_unixtime([last_access_time]);
    

    【讨论】:

    • 知道这个值是如何更新的——对我来说似乎不是即时的,是否有某种缓存?什么算作“访问”,是否应该读取任何表导致更新?
    • 我的情况下,这个时间戳似乎已更新,而 Hive 元数据存储中的 LAST_ACCESS_TIME 为 0。这对我来说没有任何意义,知道吗?
    【解决方案2】:

    我碰巧想要同样的效果。 花点时间,终于成功了; 你的方法是对的,价值才是王道;

    <property>
       <name>hive.security.authorization.sqlstd.confwhitelist.append</name>
       <value>hive\.exec\.pre\.hooks</value>
    </property>
    
    <property>
       <name>hive.exec.pre.hooks</name>
      <value>org.apache.hadoop.hive.ql.hooks.UpdateInputAccessTimeHook$PreExec</value>
    </property>
    

    如果仍然无法正常工作,可能是您的蜂巢有错误HIVE-18060UpdateInputAccessTimeHook fails for non-current database。 如果您使用 cdh ,则在 CDH5.15 CDH 5.15.0 Release Notes 中修复。

    【讨论】:

      猜你喜欢
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多