解决在org.apache.hive.hcatalog.data.schema.HCatSchema.get遇到NullPointerException
 在使用hive sqoop import过程中遇到NullPointerExcetption at org.apache.hive.hcatalog.data.schema.HCatSchema.get
 这大概率是导入hive的目标表结构与同步的column选项不匹配造成的。
下面是一些解决这个问题的步骤或者说是排查思路:
1. 解决方法:
-  hive表中缺少列或列不正确,修改重建下hive表。 
-  sqoop import的写法:
sqoop import \
--connect jdbc:mysql://<host>:<port>/<database> \
--username <username> \
--password <password> \
--table <table-name> \
--columns "id,name,salary" \
--target-dir <hdfs-target-dir> \
--fields-terminated-by <delimiter> \
--lines-terminated-by '\n' \
--m <number-of-mappers>
2. 数据库列不正确的情况
如果sqoop import时是数据库表缺少列,则在Executing SQL statement时会直接报错告诉你缺少哪一列,如下:
 ERROR util.SqlTypeMap: It seems like you are looking up a column that does notERROR util.SqlTypeMap: exist in the table. Please ensure that you've specifiedERROR util.SqlTypeMap: correct column names in Sqoop options.ERROR tool.ImportTool: Imported Failed: column not found: XXXX
这时需要修改的就不是hive表了 ,而是数据库表。
3. HCatSchema对象的初始化,对HCatSchema的理解
HCatSchema对象通常是通过HCatalog的API从Hive表或HCatalog表中获取的。例如,你可能使用了HCatClient的getTable方法来获取HCatTable对象,然后从该对象中获取HCatSchema。
HCatClient hcatClient = HCatUtil.getHCatClient(hiveConf);
HCatTable table = hcatClient.getTable("databaseName", "tableName");
HCatSchema schema = table.getSchema();
// 现在你可以安全地使用schema.get(...)
如果上述任何一步返回了null(例如,table或schema),那么在后续的get调用中就会出现NullPointerException。
4. 验证Hive表和HCatalog表的存在
确保你尝试获取的Hive表或HCatalog表确实存在,并且你有足够的权限来访问它。如果表不存在或你的用户没有足够的权限,getTable方法可能会返回null。
5. 编写防御性代码
最后,作为一种防御性编程的做法,你可以在调用HCatSchema.get方法之前检查对象是否为null。这可以防止NullPointerException的发生,但需要注意的是,这可能会掩盖潜在的错误或问题。
if (schema != null) {// 安全地使用schema.get(...)
} else {// 处理schema为null的情况,例如记录错误或抛出更有意义的异常
}
总结
当在org.apache.hive.hcatalog.data.schema.HCatSchema.get方法中遇到NullPointerException时,如果问题源于Hive表结构不正确,首先需要检查Hive表是否存在且结构定义无误。确保Hive配置正确,并且应用程序能够成功连接到Hive服务器。