【问题标题】:Unable to load managed table with maptype column (complex datatype) from external table in hive无法从配置单元中的外部表加载带有 maptype 列(复杂数据类型)的托管表
【发布时间】:2021-08-25 03:24:33
【问题描述】:

我有复杂数据类型的外部表,(map(string,array(struct))),我可以毫无问题地选择和查询这个外部表。 但是,如果我尝试将此数据加载到托管表中,它将永远运行。是否有任何最佳方法可以将此数据加载到配置单元中的托管表?

CREATE EXTERNAL TABLE DB.TBL( 
  id string ,
  list map<string,array<struct<ID:string,col:boolean,col2:string,col3:string,col4:string>>> 
) LOCATION <path>

【问题讨论】:

    标签: hive hdfs hiveql complex-data-types


    【解决方案1】:

    顺便说一句,您可以将表转换为托管(尽管由于仓库目录限制,这可能不适用于 cloudera 分发):

    use DB;
    alter table TBLSET TBLPROPERTIES('EXTERNAL'='FALSE');
    

    如果您需要加载到另一个托管表,您可以简单地将文件复制到它的位置。

    --创建托管表(或使用现有的)

    use db;
    create table tbl_managed(id string, 
                     list map<string,array<struct<ID:string,col:boolean,col2:string,col3:string,col4:string>>> ) ;
    
     --Check table location
    use db;
    desc formatted tbl_managed;
    

    这将打印位置以及其他信息,用于复制文件。

    将所有文件从外部表位置复制到托管表位置,这将最有效,比 insert..select 快得多:

    hadoop fs -cp external/location/path/* managed/location/path
    

    复制文件后,表格将是可选的。您可能需要分析表以计算统计信息:

    ANALYZE TABLE db_name.tablename COMPUTE STATISTICS [FOR COLUMNS] 
    

    【讨论】:

    • 此解决方案一次有效,但我需要每天通过插入覆盖加载托管表。没有列表(地图)列查询运行良好。任何处理这种复杂数据类型的解决方案都将不胜感激。
    • @Shine 日常运行有什么问题,请解释什么不起作用。您可以每天复制新文件。你是什​​么意思复杂类型处理?我不知道复杂类型如何与慢负载相关联。它可以是别的东西,需要执行细节:加载脚本、查询计划、执行日志以了解什么工作缓慢
    猜你喜欢
    • 2016-11-30
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多