问题
在使用sqoop拉取数据到hive数据库时,如果hive中的表是parquet格式的分区表,那么虽然显示拉取数据成功,但查询数据时会出问题
sqoop拉取语句
/opt/cloudera/parcels/CDH/bin/sqoop import \
--username xxxx \
--password 'xxx' \
--connect "jdbc:oracle:thin:@255.255.255.255:1521/db" \
--bindir /var/log/sqoop_bin/ \
--table oracle.tablename \
--hive-database hive_dbname \
--hive-table hive_tablename \
--as-parquetfile \
--fields-terminated-by '\0001' \
--lines-terminated-by '\n' \
--hive-drop-import-delims \
--null-string '\\N' \
--null-non-string '\\N' \
-m 1
查询结果
ERROR: File 'hdfs://nameservice1/user/hive/warehouse/xxxxxx/part-m-00000' has an invalid version number: N1
This could be due to stale metadata. Try running "refresh xxxxx".
解决
使用Hcatalog参数拉取数据
Hcatalog
HCatalog是一个用于Hadoop的表和存储管理服务,它使用户使用不同的数据处理工具Pig、MapReduce和Hive时更容易读写数据。HCatalog的“表抽象”向用户展示了Hadoop分布式文件系统(HDFS)中的数据相关的视图,并确保用户无需担心他们的数据被存储在哪里或以什么格式存储,例如:RCFile格式,文本文件,或SequenceFiles。
HCatalog支持以任何可以编写SerDe(序列化器-反序列化器)的格式读写文件。默认情况下,HCatalog支持RCFile、CSV、JSON和SequenceFile格式。要使用一个自定义的格式,你必须提供InputFormat和OutputFormat以及SerDe。
sqoop使用Hcatalog参数
/opt/cloudera/parcels/CDH/bin/sqoop import \
--username xxxx \
--password 'xxx' \
--connect "jdbc:oracle:thin:@255.255.255.255:1521/db" \
--bindir /var/log/sqoop_bin/ \
--table oracle.tablename \
--hcatalog-database hive_dbname \
--hcatalog-table hive_tablename \
--hcatalog-partition-keys dt \
--hcatalog-partition-values '20220114' \
--fields-terminated-by '\0001' \
--lines-terminated-by '\n' \
--hive-drop-import-delims \
--null-string '\\N' \
--null-non-string '\\N' \
-m 1
参数解释
--table 源库中的表名
--hcatalog-database Hive中的库名
--hcatalog-table Hive库中的表名,需要抽取的表
--hcatalog-partition-keys 分区字段
--hcatalog-partition-values 分区值
--fields-terminated-by 字段间的分隔符
--lines-terminated-by 表示行尾的字符
--hive-drop-import-delims 当导入到hive中时,去掉字符串字段中的'\n'、'\r'、'\01'
--null-string 指定当字符串字段为空时的字符
--null-non-string 指定当非字符串字段为空时的字符