分享

Hcatlog 读取parquet 存储格式的表,MR 不能正确获取字段的值

scala 发表于 2015-9-26 23:53:10 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 21183

目前用spark生成了parquet 格式文件:
    文件元数据A:(id:string,ts String,url String,ref String)
    生成的rdd 调用saveAsParquetFile 方法保存为文件。
hive 建立外部表:
      tbl_a (id string,ts string,url string,ref string)
      ROW FORMAT SERDE
      'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
      STORED AS INPUTFORMAT
      'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
     OUTPUTFORMAT
     'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
     LOCATION .....

hive 查询没问题 结果正确,
现在 建立tbl_b (id string,ref string) ... 其他都类似tbl_a
  hive 直接查询 tbl_b  结果显示正常,并且的确是ref 字段。
  
现在通过 mr 来读取tbl_b   的数据:
         ...
         ...
        HCatSchema schema;
            protected void setup(Mapper<WritableComparable, HCatRecord, Text, IntWritable>.Context context) throws IOException,
                        InterruptedException {
                this.schema = HCatInputFormat.getTableSchema(context.getConfiguration());
        }

        protected void map(WritableComparable key, HCatRecord value,
                        Mapper<WritableComparable, HCatRecord, Text, IntWritable>.Context context) throws IOException, InterruptedException {
                String ref=value.getString("ref", this.schema);


  结果 ref 实际上输出的是ts 字段,这个地方弱智的按字段顺序来读取数据了。
按道理hive 能正确读取,hcatlog 问题也应该不大。
parquet 本来文件就是自我描述的,hive读取数据也证明了这一点,但是hcatlog 就不行了,直接按字段顺序来读取了
这个文件大家遇到过的吗?有什么办法解决没?

ps 环境信息 :
        sparak 版本为1.2 和1.3  
        hive 0.14
         hadoop 2.6/2.7
         /usr/hdp/2.3.0.0-2557/hive-hcatalog/share/hcatalog/hive-hcatalog-core-1.2.1.2.3.0.0-2557.jar


已有(3)人评论

跳转到指定楼层
scala 发表于 2015-9-26 23:54:21
补充一下,tbl_a  ,tbl_b 用的同一份数据
回复

使用道具 举报

hyj 发表于 2015-9-27 12:22:56
这些需要看源码,既然楼主认为是按顺序,楼主测试到底是不是这样
回复

使用道具 举报

scala 发表于 2015-9-27 22:18:08
是的,我把每个字段的值都打出来了,tb_b 表的ref 的值直接输出的是ts 字段的值。而tb_a 的结构和文件定义的一致,所以读取都是正确的值。搞不清为什么hive没问题而hcatlog 有问题,看来不得不读源代码了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条