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问题


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

查看所有标签

猜你喜欢:

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

码出高效:Java开发手册

码出高效:Java开发手册

杨冠宝、高海慧 / 电子工业出版社 / 2018-10 / 99.00元

《码出高效:Java 开发手册》源于影响了全球250万名开发工程师的《阿里巴巴Java开发手册》,作者静心沉淀,对Java规约的来龙去脉进行了全面而彻底的内容梳理。《码出高效:Java 开发手册》以实战为中心,以新颖的角度全面阐述面向对象理论,逐步深入地探索怎样成为一位优秀开发工程师。比如:如何驾轻就熟地使用各类集合框架;如何得心应手地处理高并发多线程问题;如何顺其自然地写出可读性强、可维护性好的......一起来看看 《码出高效:Java开发手册》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具