美文网首页
Hive是如何保证表字段的顺序的

Hive是如何保证表字段的顺序的

作者: BIGrey | 来源:发表于2019-03-08 19:25 被阅读0次

    通过看代码会发现,在获取所有字段的时候,都是调用table.getCols()方法,返回的是一个List<FieldSchema>,也就是说从Metastore获取的时候,这个List已经按照定义的顺序排列好了顺序。

    然后转到Metastore的代码,一直追溯源头到jdo的query,都找不到最这个List做排序的地方。那也只能是jdo在底层做了什么事情。

    一开始也没有什么线索,光靠一些自找的关键词来搜索jdo相关的文章,都没有找到。

    最后是查看了一下MySQL中存储字段的那个表的定义:

    CREATE TABLE `COLUMNS_V2` (
      `CD_ID` bigint(20) NOT NULL,
      `COMMENT` varchar(256) CHARACTER SET utf8 DEFAULT NULL,
      `COLUMN_NAME` varchar(128) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
      `TYPE_NAME` varchar(4000) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL,
      `INTEGER_IDX` int(11) NOT NULL,
      PRIMARY KEY (`CD_ID`,`COLUMN_NAME`),
      KEY `COLUMNS_V2_N49` (`CD_ID`),
      CONSTRAINT `COLUMNS_V2_FK1` FOREIGN KEY (`CD_ID`) REFERENCES `CDS` (`CD_ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    

    里面有一个INTEGER_IDX字段,猜想这个应该就是jdo自动生成的东西了。查了一下资料果然如此,事情的真相是这样的:

    在使用jdo时,如果你定义Model的时候使用了List类型的字段(比如这里的List<FieldSchema>),datanucleus在构造MySQL表的时候,会自动生成一个索引字段INTEGER_IDX(在datanucleus2中是IDX)从0开始递增,然后在查询的时候自动会在查询语句中加入ORDER BY INTEGER_IDX,这样就保证了顺序了。

    具体可以参考一下这个的说明Hive-11039

    相关文章

      网友评论

          本文标题:Hive是如何保证表字段的顺序的

          本文链接:https://www.haomeiwen.com/subject/tnsdpqtx.html