如何将ORC BytesColumnVector值设置为NULL?

时间:2018-04-15 09:08:39

标签: java orc

我正在使用Groovy编写ORC文件。

其中一列是String。 ORC列类型为:

.addField("Name", TypeDescription.createString())

列向量是:

BytesColumnVector vName = (BytesColumnVector) batch.cols[1]

要分配给vName的值可能包含NULL,但我无法让ORC在其数据中写入空值。

尝试通过set(),setValue()或setRef()分配空值会在赋值点或在ORC中更深地写入批处理行时抛出空指针错误。

我能得到的最接近的是:

byte[] b = new byte[0]
vName.setRef (i,b,0,0)

但是这会将空字符串放入数据文件中,如以下转储片段所示(请参阅第二列,'名称'):

{"ProductID":355,"Name":"","MakeFlag":false,"StandardCost":0,"Weight":null,"ModifiedDate":"2014-02-08 10:01:36.827"}

关于如何设置空字符串的任何想法?

编辑:通过这个问题的答案,我能够完成一些代码,将数据库表的内容写入ORC。它可能对搜索ORC相关示例的人有用。 https://www.linkedin.com/pulse/orc-adls-polybase-ron-dunn/ enter link description here

1 个答案:

答案 0 :(得分:4)

我使用的是空字符串。我不认为还有另一种方法可以做到。

只需确保将列标记为包含空值。

您的代码理想情况如下:

BytesColumnVector vName = (BytesColumnVector) batch.cols[1];
byte[] EMPTY_BYTES = "".getBytes(StandardCharsets.UTF_8);
vName.setRef(i, EMPTY_BYTES, 0, 0);
vName.isNull[i] = true;
vName.noNulls = false;