RCFile - 发出GZip压缩的int列

时间:2013-09-09 19:13:28

标签: hadoop

出于某种原因,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字段显示为NULLindicating some error

SELECT * from db.table;

OK
NULL    my string field
Time taken: 0.647 seconds

知道这里可能会发生什么吗?

1 个答案:

答案 0 :(得分:0)

所以,我不确定为什么会这样,但我使用以下方法让它工作:

在写入表示整数值的字节数组的代码中,而不是使用WritableUtils.toByteArray(),而不是Text.set(Integer.toString(intVal)).getBytes()

换句话说,我将整数转换为其String表示,并使用Text可写对象来获取字节数组,就好像它是一个字符串一样。

然后,在我的Hive DDL中,我可以将列调用int并正确解释它。

我不确定最初导致问题的是什么,无论是WritableUtils中的错误,与压缩整数字节数组的某些不兼容,还是错误地理解这些东西对我的影响。无论如何,上述解决方案成功地满足了任务的需求。