项目中抛弃了通过sqoop方式将数据从關系型数据库导入到HIVE的方式而是采用一种JdbcHandler的方式,直接将关系型数据库中的数据映射到hive的方式算是对hive分析关系型数据库中数据的一种優化方案,hive官网也很早就提出了要实现这一功能不过还没有发布:
通过一步一步调试hive源码,发现之所以“
”能够正确显示,是因为并沒有通过hive的FilterOperator去进行二次过滤而是直接从数据库中取出来显示了一下。而添加了where条件则不同了虽然从oracle中查出了实际的数据,但是在经过JdbcHandler嘚反序列化后hive会在二次过滤时将where条件中的值和表中该char字段值里包含什么的数据进行了比较(hive识别的数据行类型:bytesrefarraywritable),举个例子:select
name=“helianthus”(这里orchid为關于oracle的hive外部表name在oracle表中对应为char类型),hive在实际处理时将where条件中的数值转化的字节码值和实际该值所处的char字段值里包含什么中的值所转化的數据类型不同(该char字段值里包含什么的类型会转为LazyStringObjectInspector,而where条件中的数据值类型会转为WritableConstantStringObjectInspector),字节码值不相同因此,就被在二次过滤(FilterOperator)时被过滤掉了吔就是说没有符合where条件的数据。这是一层原因还有一层原因,那就是oracle的char类型这真是个坑啊!char类型是长度固定的
,如果存储的数据没有達到指定长度自动补足空格
。这也就从根本上解释了为什么将where条件转化为hive中的where字节码时不能够和该char字段值里包含什么的值匹配上:
3.解决辦法 在从oracle中查出char类型数据以后在JdbcHandler的反序列化阶段将其实际数据右边的空格全部去除掉就能够和where条件匹配上了。测试通过
ps:这虽然最后发現是个小问题,但是希望给那些也遇到类似问题的人一个小小的帮助避开这个坑。