CarbonHelperSqlAstBuilder.createCarbonTable:
生成TableIdentifier;对不支持的建表语句进行验证,比如不支持Temp View,SKEWED BY,CLUSTERED BY及EXTERNAL TABLE;获取column列表,如果有分区字段,则进行合并àfields;如果是streaming表,暂不支持分区表;CarbonSpark2SqlParser.prepareTableModel:
该方法就是对所有列进行dimension及measure的划分
对所有列fields按建表时的顺序进行编号;调用extractDimAndMsrFields方法开始划分dimension和measure列:- sortcolumns目前暂不支持如下类型:"array", "struct","double", "float", "decimal",希望后续有更多的人来参与实现;
- 如果在DICTIONARY_INCLUDE中有定义的列,则加到dimFields;
- 为TIMESTAMP类型且不存在于dictIncludeCols中的列,则同时加到noDictionaryDims和dimFields;
- 类型如果是"string", "array","struct", "timestamp", "date", "char",则加到dimFields,但如果是string类型,则同时需要加入到noDictionaryDims;
- 如果在SORT_COLUMNS中的列,则同时加入到noDictionaryDims和dimFields;
- 其他则加入到msrFields;
- 如果没有定义sort columns,则把dimFields中(除"array", "struct"类型外)的列都作为sortKeyDims;
调用extractNoInvertedIndexColumns获取NO_INVERTED_INDEX的列信息;调用getPartitionInfo获取分区信息:支持HASH,RANGE,LIST三种分区类型(CarbonData社区用户主要用的是Hive标准分区,HASH,RANGE,LIST三种分区当前为Alpha特性);检验TABLE_BLOCKSIZE,只支持1-2048MB的范围;检验TableLevelCompaction属性;对dimFields中列进行重新排序,把复杂(Array,Struct)类型的数据排到最后,普通类型放在前面;TableNewProcessor(tableModel).process:
对TableModel中的sortKeyDims、dimCols、msrCols进行UUID和Encoding设置,生成对应的ColumnSchema:- 对于sortKeyDims:出现在noDictionaryDims中的列,都不具有Encoding.DICTIONARY;Date和Timestamp(不在noDictionaryDims中)类型则具有Encoding.DIRECT_DICTIONARY;
- 对于dimCols:不在sortKeyDims中的列都增加Encoding.DICTIONARY;
- 对于msrCols:不具有任何Encoding;
扫描allColumns,如果列在TableModel.noInvertedIdxCols中或者TableModel.msrCols中,则为NO INVERTED INDEX 列,否则就具有Encoding.INVERTED_INDEX(此部分逻辑可以进一步优化,后续会提交PR到社区,应该是SORT COLUMNS列都默认具有INVERTED INDEX,除非在NO_INVERTED_INDEX属性中特别指定的列,不过该问题不会影响实际的写数据,写数据时的判断逻辑是正确的);生成val tableInfo = new TableInfo(),val tableSchema = new TableSchema(),tableInfo.setFactTable(tableSchema);至此,列的划分结束,allColumns中的列是按照先sort column列,非sort column的dimensions列、complex data type 列、measures列的顺序排序;CarbonCreateTableCommand.processMetadata:
生成CarbonTable carbonTable =CarbonTable.buildFromTableInfo(tableInfo);调用CarbonUtil.convertToMultiGsonStrings,用Gson把TableInfo转为json string,并分割为几个部分,中间会加上一些carbonSchemaPartsNo及carbonSchemaN的字符串,每个部分长度为4000;拼凑实际的Create Table语句,指定DataSource:'USING org.apache.spark.sql.CarbonSource',并把上一步骤分割的字符串作为建表的options加入到SQL中;>
如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:
iteblog_hadoopCarbonSource.updateCatalogTableWithCarbonSchema
:把上步骤中建表语句中的carbonSchemaPartsNo和carbonSchemaN属性读取出来拼凑为TableInfo的json string,然后反序列化为TableInfo实例,调用CarbonFileMetastore.saveToDisk(tableInfo, properties("tablePath"))
方法,使用ThriftWriter写到Metadata/schema文件中;然后把建表语句中的carbonSchemaPartsNo和carbonSchemaN属性去除;CreateDataSourceTableCommand.run
:调用sessionState.catalog.createTable(newTable,ignoreIfExists = false)
执行建表语句; 本博客文章除特别声明,全部都是原创!
原创文章版权归过往记忆大数据(过往记忆)所有,未经许可不得转载。
本文链接: 【CarbonData源码浅析一:Create Table】(https://www.iteblog.com/archives/2349.html)