内容简介:作者:余枫1问题重现
作者:余枫
1
问题重现
1.在 MySQL 中建表,一个bigint字段,二个varchar字段
2.在Hive中建Parquet表
create table test(
s1 string comment '字段1',
s2 string comment '字段2',
s3 string comment '字段3'
) comment '测试表'
stored as parquet;
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
4.查看导入HDFS的文件格式
/opt/cloudera/parcels/CDH/lib/parquet/bin/parquet-tools meta ./5fc2fe2c-10da-4aae-b432-c2b70542bfaf.parquet
5.数据导入成功后查看Hive表的数据
Hive中查看,查询出的数据为null
Impala中查看,可以正常查看数据
2
问题分析
在Sqoop抽取MySQL到HDFS的命令中,使用的是query方式,并且语句中使用了cast(s1 as char)的方式,这样查询出来的结果列名产生了变化,不是原来的s1。
由上图可见,列名变化了,因此产生的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
·在Hive中进行查询,查询成功
·在Impala中进行查询,查询成功
2.在Hive中执行命令 set parquet.column.index.access=true;
这个参数的意义是在Hive中以列的序号来访问Parquet数据文件,该参数默认设置为false,即默认是以列名来访问Parquet数据文件。
·在Hive中进行设置
·在Hive中进行查询,查询成功
·在Impala中进行查询,查询成功
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),非常欢迎大家积极投稿。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- sql server2008导入文本文件
- 以太坊钱包开发:账号Keystore文件导入导出
- Qt中pro文件从相对路径导入库
- 将Excel文件导入数据库(POI+Excel+MySQL+jsp页面导入)第一次优化
- Visual Studio 协作开发,导入强命名密钥文件的方法
- ER模型设计工具:设计ER模型及MySQL DDL文件导入及生成
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Django 1.0 Template Development
Scott Newman / Packt / 2008 / 24.99
Django is a high-level Python web application framework designed to support the rapid development of dynamic websites, web applications, and web services. Getting the most out of its template system a......一起来看看 《Django 1.0 Template Development》 这本书的介绍吧!