出于某种原因,Hive不会识别以整数形式发布的列,但会识别以字符串形式发布的列。
是否有关于Hive或RCFile
或GZ的内容阻止正确呈现int?
My Hive DDL看起来像:
create external table if not exists db.table (intField int, strField string) stored as rcfile location '/path/to/my/data';
我的Java的相关部分看起来像:
BytesRefArrayWritable dataWrite = new BytesRefArrayWritable(2);
byte[] byteArray;
BytesRefWritable bytesRefWritable = new BytesRefWritable(); intWritable.set(myObj.getIntField());
byteArray = WritableUtils.toByteArray(intWritable.get());
bytesRefWritable.set(byteArray, 0, byteArray.length);
dataWrite.set(0, bytesRefWritable); // sets int field as column 0
bytesRefWritable = new BytesRefWritable();
textWritable.set(myObj.getStrField());
bytesRefWritable.set(textWritable.getBytes(), 0, textWritable.getLength());
dataWrite.set(1, bytesRefWritable); // sets str field as column 1
代码运行正常,通过日志记录,我可以看到各种Writables
中有字节。
Hive也可以读取外部表格,但int
字段显示为NULL
,indicating some error。
SELECT * from db.table;
OK
NULL my string field
Time taken: 0.647 seconds
知道这里可能会发生什么吗?
答案 0 :(得分:0)
所以,我不确定为什么会这样,但我使用以下方法让它工作:
在写入表示整数值的字节数组的代码中,而不是使用WritableUtils.toByteArray()
,而不是Text.set(Integer.toString(intVal)).getBytes()
。
换句话说,我将整数转换为其String
表示,并使用Text
可写对象来获取字节数组,就好像它是一个字符串一样。
然后,在我的Hive DDL中,我可以将列调用int
并正确解释它。
我不确定最初导致问题的是什么,无论是WritableUtils
中的错误,与压缩整数字节数组的某些不兼容,还是错误地理解这些东西对我的影响。无论如何,上述解决方案成功地满足了任务的需求。