Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

栏目: 编程工具 · 发布时间: 6年前

内容简介:作者:余枫1问题重现

作者:余枫

1

问题重现

1.在 MySQL 中建表,一个bigint字段,二个varchar字段

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

2.在Hive中建Parquet表

create table test(
s1 string comment '字段1',
s2 string comment '字段2',
s3 string comment '字段3'
) comment '测试表'
stored as parquet;

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

3.使用Sqoop从MySQL导入数据到HDFS,要导入的目录是Hive中新建表的数据目录

sqoop import --connect jdbc:mysql://192.168.0.178:3306/test --username root --password 123456 --query "select cast(\`s1\` as char),cast(\`s2\` as char),cast(\`s3\` as char) from \`test_sqoop\` where ( 1=1 ) and \$CONDITIONS" --as-parquetfile --append --target-dir /user/hive/warehouse/tsqoop.db/test --m 1

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

4.查看导入HDFS的文件格式

/opt/cloudera/parcels/CDH/lib/parquet/bin/parquet-tools meta ./5fc2fe2c-10da-4aae-b432-c2b70542bfaf.parquet

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

5.数据导入成功后查看Hive表的数据

Hive中查看,查询出的数据为null

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

Impala中查看,可以正常查看数据

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

2

问题分析

在Sqoop抽取MySQL到HDFS的命令中,使用的是query方式,并且语句中使用了cast(s1 as char)的方式,这样查询出来的结果列名产生了变化,不是原来的s1。

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

由上图可见,列名变化了,因此产生的Parquet数据文件中的列名与Hive中建表时定义的列名不同。而在Hive中默认使用名字来查询Parquet的列,所以在Hive中查询出的数据都是null;而在Impala中,则是以位置来查询,所以在Impala中能够正常的查询到数据。

3

问题解决

解决方式有两种,如下:

1.Sqoop命令从MySQL中抽取数据到HDFS时,query语句中指定Hive建表时定义的列名。

·修改Sqoop命令如下,在query中指定Hive表定义的列名

sqoop import --connect jdbc:mysql://192.168.0.178:3306/test --username root --password 123456 --query "select cast(\`s1\` as char) s1,cast(\`s2\` as char) s2,cast(\`s3\` as char) s3 from \`test_sqoop\` where ( 1=1 ) and \$CONDITIONS" --as-parquetfile --append --target-dir /user/hive/warehouse/tsqoop.db/test --m 1

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

·在Hive中进行查询,查询成功

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

·在Impala中进行查询,查询成功

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

2.在Hive中执行命令 set parquet.column.index.access=true;

这个参数的意义是在Hive中以列的序号来访问Parquet数据文件,该参数默认设置为false,即默认是以列名来访问Parquet数据文件。

·在Hive中进行设置

·在Hive中进行查询,查询成功

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

·在Impala中进行查询,查询成功

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题

4

总结

1.使用Sqoop命令进行数据抽取为Parquet格式时,如果导入的数据的列名与Hive建表时定义的列名不一致,会导致Hive中查询到数据为null,因为Hive默认使用列名来访问Parqeut数据文件,可以通过参数 set parquet.column.index.access=true 来修改访问方式。

2.在Hive和Impala中,默认访问Parquet数据文件的方式不一样,Hive是以列名,Impala是以位置,这一点需要注意。

大家工作学习遇到HBase技术问题,把问题发布到HBase技术社区论坛http://hbase.group,欢迎大家论坛上面提问留言讨论。想了解更多HBase技术关注HBase技术社区公众号(微信号:hbasegroup),非常欢迎大家积极投稿。

Sqoop实操|Sqoop导入Parquet文件Hive查询为null问题


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

图形程序开发人员指南

图形程序开发人员指南

Michael Abrash / 前导工作室 / 机械工业出版社 / 1998 / 128

Michael Abrash's classic Graphics Programming Black Book is a compilation of Michael's previous writings on assembly language and graphics programming (including from his "Graphics Programming" column......一起来看看 《图形程序开发人员指南》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具