Hive中文注释乱码解决方案(2)

摘要:
本文来自网易云社区作者:王潘安在launchTask的执行阶段返回Driver类的runInternal方法。请参见以下执行过程。在runInternal方法中,执行进程调用execute方法。execute方法中有很多内容,但只有launchTask方法与我们相关。该方法有几个关键步骤:tsk。初始化(conf,plan,cxt);任务R

本文来自网易云社区

作者:王潘安


执行阶段

launchTask    回到Driver类的runInternal方法,看以下执行过程。在runInternal方法中,执行过程调用了execute方法。execute方法里面的内容很多,但是跟我们有关系的就只有launchTask方法。这个方法里面有这么关键的几步:

     tsk.initialize(conf, plan, cxt);
    TaskResult tskRes = new TaskResult();
    TaskRunner tskRun = new TaskRunner(tsk, tskRes);

    cxt.launching(tskRun);

    tskRun.runSequential();

跟进runSequential方法发现调用了如下方法:

 exitVal = tsk.executeTask();

接着跟进,发现执行了这段代码:

     int retval = execute(driverContext);

这个execute 方法在执行show create table xx命令时就是执行的DDLTask类中的execute方法。

跟进execute方法找到如下代码:

       ShowCreateTableDesc showCreateTbl = work.getShowCreateTblDesc();
      if (showCreateTbl != null) {
        return showCreateTable(db, showCreateTbl);
      }

查看showCreateTable方法,发现它干的就是把返回结果的字段都拼接成模板,然后把从metastore里面拿到的内容塞进去,最后写到一个临时文件流里面。我们发现,它最后是这样写到文件流的:

 outStream.writeBytes(createTab_stmt.render());

中文在这个地方估计被写成乱码了,于是把它改为:

     outStream.write(createTab_stmt.render().getBytes("UTF-8"));

重新编译一下hive:

 mvn clean package -Phadoop-2 -DskipTests

把编译完成后的hive源码的ql/target目录的hive-exec-1.2.1.jar替换到运行的hive的lib目录中,建一个测试表,不用json序列化反序列化,发现show create table xx命令的字段中文注释正常了。但是如果测试表仍用json序列化和反序列化,那么仍然会出现注释为from deserializer的现象。

我们回到代码,看看在showCreateTable方法中究竟是如何获取字段的注释信息的。找到如下这段代码:

     List<FieldSchema> cols = tbl.getCols();

跟进去发现,如果设置了自定义的序列化与反序列化类,就会执行这行操作:

 return MetaStoreUtils.getFieldsFromDeserializer(getTableName(), getDeserializer());

跟进getFieldsFromDeserializer方法,我们发现如下几行重要代码:

 ObjectInspector oi = deserializer.getObjectInspector();
  List<? extends StructField> fields = ((StructObjectInspector) oi).getAllStructFieldRefs();
  for (int i = 0; i < fields.size(); i++) {
    StructField structField = fields.get(i);
    String fieldName = structField.getFieldName();
    String fieldTypeName = structField.getFieldObjectInspector().getTypeName();
    String fieldComment = determineFieldComment(structField.getFieldComment());

    str_fields.add(new FieldSchema(fieldName, fieldTypeName, fieldComment));
  }

也就是说注释是从deserializer中拿出来的。那我们在返回去看看,hive给我们的json deserializer传了什么参数。返回到上一段代码,我们看getDeserializer方法干了什么:

     deserializer = getDeserializerFromMetaStore(false);

我们最好在这打个断点,看看,跟进代码发现执行了:

     return MetaStoreUtils.getDeserializer(SessionState.getSessionConf(), tTable, skipConfError);

然后通过反射建了一个Deserializer的实例,并且调用了它的initialize方法:

       Deserializer deserializer = ReflectionUtil.newInstance(conf.getClassByName(lib).
              asSubclass(Deserializer.class), conf);
       SerDeUtils.initializeSerDeWithoutErrorCheck(deserializer, conf,
                MetaStoreUtils.getTableMetadata(table), null);

在跟进initializeSerDeWithoutErrorCheck方法,发现它执行了:

 deserializer.initialize(conf, createOverlayedProperties(tblProps, partProps));

我们在跟进以下MetaStoreUtils.getTableMetadata(table)发现它执行了MetaStoreUtils.getSchema这个方法。跟进去,我们发现了至关重要的代码,注意所有的奥妙都在这:

     for (FieldSchema col : tblsd.getCols()) {
      if (!first) {
        colNameBuf.append(",");
        colTypeBuf.append(":");
        colComment.append('

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇巧用CSS属性visibility与opacity代替鼠标经过的jQuery事件Chrome inspect学习(四)本地环境/测试环境前端与客户端交互,涉及客户端代码报错,如何调试下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

hive之managed table创建

Welcome to the world of Hive-0.10.0, now we will use Managed Tables: 1. hive> create database if not exists dataprocess            >  comment 'analyze cluster data'        ...

Hive入门学习随笔(一)

===什么是Hive? Hive是基于Hadoop HDFS之上的数据仓库。 我们可以把数据存储在这个基于数据的仓库之中,进行分析和处理,完成我们的业务逻辑。 本质上就是一个数据库 ===什么是数据仓库? 实际上就是一个数据库。我们可以利用数据仓库来保存我们的数据。 与一般意义上的数据库不同。数据库是一个面向主题的、集成的、不可更新的、随时间不变化的数据集...

使用hive访问elasticsearch的数据

使用hive访问elasticsearch的数据 1.配置 将elasticsearch-hadoop-2.1.1.jar拷贝到hive/lib hive -hiveconf hive.aux.jars.path=/usr/local/hive-1.2.1/lib/elasticsearch-hadoop-2.1.1.jar 或者配置: hive-s...

Hive默认显示数据库和表名配置

hive-site.xml添加以下参数: <property> <name>hive.cli.print.current.db</name> <value>true</value> </property> <property> <name&...

HIVE基础(20):Hive函数(9) over 窗口函数

hive窗口函数语法 在前言中我们已经说了avg()、sum()、max()、min()是分析函数,而over()才是窗口函数,下面我们来看看over()窗口函数的语法结构、及常与over()一起使用的分析函数 over()窗口函数的语法结构 常与over()一起使用的分析函数 窗口函数总结 1、over()窗口函数的语法结构 分析函数 over(p...

Hive/Impala批量插入数据

问题描述 现有几千条数据,需要插入到对应的Hive/Impala表中。安排给了一个同事做,但是等了好久,反馈还没有插入完成……看到他的做法是:对每条数据进行处理转换为对应的insert语句,但是,实际执行起来,速度很慢,每条数据都要耗时1s左右。比在MySQL中批量插入数据慢多了,因而抱怨Impala不太好用 问题分析 首先,必须明确的是,把每条数据处理成...