【问题标题】:How to set ORC BytesColumnVector value to NULL?如何将 ORC BytesColumnVector 值设置为 NULL?
【发布时间】:2018-09-25 04:30:31
【问题描述】:

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

其中一列是字符串。 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)

但这会将一个空字符串放入数据文件中,如下面的转储 sn -p 所示(参见第二列,“名称”):

{"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

【问题讨论】:

  • 我使用的是空字符串。还要设置vName.isNull[I] = true; vName.noNulls = false;
  • @OmarAli 您能否将其添加为答案,以便我可以适当地投票?你解决了我的问题,谢谢。

标签: java orc


【解决方案1】:

我使用的是空字符串。我认为没有其他方法可以做到这一点。

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

理想情况下,您的代码应如下所示:

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;

【讨论】:

  • 感谢您的回答。但问题是当我读回字符串时,它不是“null”?
猜你喜欢
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 1970-01-01
  • 2019-06-03
  • 2013-10-31
相关资源
最近更新 更多