CarbonHelperSqlAstBuilder.createCarbonTable:
  • 生成TableIdentifier;
  • 对不支持的建表语句进行验证,比如不支持Temp View,SKEWED BY,CLUSTERED BY及EXTERNAL TABLE;
  • 获取column列表,如果有分区字段,则进行合并àfields;
  • 如果是streaming表,暂不支持分区表;
  • CarbonSpark2SqlParser.prepareTableModel:

    该方法就是对所有列进行dimension及measure的划分

  • 对所有列fields按建表时的顺序进行编号;
  • 调用extractDimAndMsrFields方法开始划分dimension和measure列:
    1. sortcolumns目前暂不支持如下类型:"array", "struct","double", "float", "decimal",希望后续有更多的人来参与实现;
    2. 如果在DICTIONARY_INCLUDE中有定义的列,则加到dimFields;
    3. 为TIMESTAMP类型且不存在于dictIncludeCols中的列,则同时加到noDictionaryDims和dimFields;
    4. 类型如果是"string", "array","struct", "timestamp", "date", "char",则加到dimFields,但如果是string类型,则同时需要加入到noDictionaryDims;
    5. 如果在SORT_COLUMNS中的列,则同时加入到noDictionaryDims和dimFields;
    6. 其他则加入到msrFields;
    7. 如果没有定义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:
    1. 对于sortKeyDims:出现在noDictionaryDims中的列,都不具有Encoding.DICTIONARY;Date和Timestamp(不在noDictionaryDims中)类型则具有Encoding.DIRECT_DICTIONARY;
    2. 对于dimCols:不在sortKeyDims中的列都增加Encoding.DICTIONARY;
    3. 对于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中;
  • >

    CarbonData源码浅析一:Create Table
    如果想及时了解Spark、Hadoop或者Hbase相关的文章,欢迎关注微信公共帐号:iteblog_hadoop
  • CarbonSource.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)
    喜欢 (7)
    分享 (0)
    发表我的评论
    取消评论

    表情
    本博客评论系统带有自动识别垃圾评论功能,请写一些有意义的评论,谢谢!