如何获取'null'使用hiveserver2替换c# thrift.dll中字段列的默认值

本文关键字:thrift dll 默认值 字段 替换 使用 何获取 获取 null hiveserver2 | 更新日期: 2023-09-27 18:09:35

我目前使用HiveServer2与thrift.dll库。如果我尝试从thrift对象创建一个元组,我希望没有在对象中设置的字段在tuple中被标记为null。然而,默认值被放入元组中。例如

HqlConnection con = new HqlConnection("localhost", 10001, HiveServer.HiveServer2);    
con.Open();   
HqlCommand createCommand1 = new HqlCommand("select id,name,age,DOB,marks from engineer_list", con);   
createCommand1.ExecuteNonQuery();   
HqlDataReader reader = createCommand1.ExecuteReader();

预期输出应为

{(1"约翰"24日2010-01-01 10:22:47,45.6),(2空,空,空,空)}

但实际结果是:

{(1"约翰"24日2010-01-01 10:22:47,45.6),(2…0,0)}

当我们发送请求调用包含NULL值的类型(int, double, long, float..)的数值列时,意味着thrift.dll本身返回为零,而不是nullDBNull.value

对于字符串,时间戳类型意味着thrift.dll本身作为空字符串返回,而不是nullDBNull.value

通过分析thrift.dll的源代码,我们通过执行

触发读取列的方法类:

Thrift.Protocol.TBinaryProtocol

方法: ReadAll(buffer, offset, length)默认返回0。

Description:这将从thriftServer端口获取数据流

对于Int值下面的方法调用,如果数据包含'null',将返回'0'

private byte[] i32in = new byte[4];
public override int ReadI32()
{
  ReadAll(i32in, 0, 4);
  return (int)(((i32in[0] & 0xff) << 24) | ((i32in[1] & 0xff) << 16) | ((i32in[2] & 0xff) << 8) | ((i32in[3] & 0xff)));
}

如何获取'null'使用hiveserver2替换c# thrift.dll中字段列的默认值

与Thrift无关:如果您将一个空STRING存储到Hive中,那么在选择字段时您将获得一个空STRING。如果你显式地存储一个Null STRING,那么你将得到一个Null。这是一个正确的DBMS应该工作的方式

不幸的是,Oracle和SQL Server对VARCHAR数据类型有自己愚蠢的规则(即在Oracle中Null可以作为空字符串出现,反之亦然,就像量子物理中的波/粒子一样;对于SQL Server,空字符串或多或少是1个字符长的字符串,其中有一个空白)。

如果您需要应用程序级别的空字符串处理,那么使用条件查询子句,如CASE WHEN duh ='' THEN CAST(Null AS STRING) ELSE duh END

[Edit] 永远不要依赖从STRING到数字数据类型的隐式转换。我同意,在这种情况下,Hive甚至比其他数据库更糟糕。

CASE WHEN duh is Null OR duh ='' THEN CAST(Null AS SMALLINT) ELSE cast(duh as SMALLINT) END

PS:在某些版本的Hive(特别是在V0.14 -从V0.13回归)中需要转换null

检查空字段。例如,如果null[0] = 12。那么它的二进制值是"1100",从右向左读,这意味着最后两个值实际上是NULL值。