我有一个数据类型复杂的外部表(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>
BTW,您可以将表转换为托管表(尽管由于仓库目录限制,这可能不适用于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;
这将打印位置和其他信息,使用它来复制文件。
将所有文件从外部表位置复制到托管表位置,这将最有效地工作,比插入快得多。。选择:
hadoop fs -cp external/location/path/* managed/location/path
复制文件后,可以选择表格。您可能需要分析表来计算统计信息:
ANALYZE TABLE db_name.tablename COMPUTE STATISTICS [FOR COLUMNS]