0

出于某种原因,Hive 不识别作为整数发出的列,但确实识别作为字符串发出的列。

Hive 或RCFileGZ 是否存在阻止正确渲染 int 的内容?

我的 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表示存在一些错误

SELECT * from db.table;

OK
NULL    my string field
Time taken: 0.647 seconds

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

4

1 回答 1

0

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

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

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

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

我不确定最初是什么导致了这个问题,可能是 中的一个错误WritableUtils、与压缩整数字节数组的一些不兼容,或者我对这些东西如何工作的错误理解。无论如何,上述解决方案成功地满足了任务的需要。

于 2013-09-10T11:45:13.523 回答