Hive ExecuteSQL处理器返回损坏的数据

Hive ExecuteSQL处理器返回损坏的数据,hive,apache-nifi,Hive,Apache Nifi,我在NiFI中有一个流程,在这个流程中,我使用ExecuteSQL处理器从配置单元表中获得一个名为dt的子分区的合并。例如:我的表按sikid和dt进行分区。所以我在sikid=1,dt=1000下,在sikid=2,dt=1000下。 我所做的是从我的表中选择*,其中dt=1000 不幸的是,我从ExecuteSQL处理器得到的回报是损坏的数据,包括dt=NULL的行,而原始表甚至没有dt=NULL的行 DBCPConnectionPool配置为使用HiveJDBC4jar。 后来我根据CDH

我在NiFI中有一个流程,在这个流程中,我使用ExecuteSQL处理器从
配置单元
表中获得一个名为dt的子分区的合并。例如:我的表按
sikid
dt
进行分区。所以我在
sikid=1,dt=1000
下,在
sikid=2,dt=1000
下。 我所做的是
从我的表中选择*,其中dt=1000

不幸的是,我从ExecuteSQL处理器得到的回报是损坏的数据,包括dt=NULL的行,而原始表甚至没有dt=NULL的行

DBCPConnectionPool
配置为使用
HiveJDBC4
jar。 后来我根据CDH版本尝试使用兼容的jar,也没有修复它

ExecuteSQL
处理器的配置如下:

规范化表/列名
true

使用Avro逻辑类型
false

配置单元版本:1.1.0

CDH:5.7.1

知道发生了什么吗?谢谢

编辑:
显然,我返回的数据包含额外的行。。。他们中有几千人。。这很奇怪。
HiveJDBC4
(我假设Simba Hive驱动程序)是否从列名中解析表名?这是一个与Apache Hive JDBC驱动程序不兼容的地方,它不支持
getTableName()
,因此不支持ExecuteSQL,即使它支持,当从ResultSetMetaData检索列名时,它们的表名前面也有一个句点
分隔符。这是HiveJdbcCommon(由SelectHiveQL使用)与JdbcCommon(由ExecuteSQL使用)中的一些自定义代码


如果您试图使用ExecuteSQL是因为身份验证方法有问题,那么Simba驱动程序如何缓解这种情况?例如,是否在JDBCURL上而不是在hive-site.xml文件中指定身份验证信息?如果您将身份验证问题(使用SelectHiveQL)作为一个单独的SO问题提问并链接到此处,我将尽最大努力帮助您解决这一问题。

最终通过使用hive属性
hive.query.result.fileformat=SequenceFile解决了这一问题,这肯定是jdbc驱动程序的问题。您是否可以检查其他基于jdbc的工具返回的结果集。例如,您可以尝试执行相同的查询。您可能还想尝试选择HiveQL而不是ExecuteSQL,前者已经包含Hive 1.2.1驱动程序,后者不“正式”支持Hive,即使有第三方driver@daggett说得好,我没有试着换司机。我目前使用的是
HiveJDBC4
,但我会尝试另一个版本。@mattyb事实上,我一开始试过使用
hive nar
,但在hadoop集群和hive中使用它时遇到了一些问题。因此,我宁愿使用ExecuteSQL处理器,这样它将是通用的。实际上,是的,它将其转换为
my_table\u columnName
。我可能真的会提出一个关于我在蜂巢中遇到的问题的问题。。谢谢,我试着从
HiveJDBC4
切换到
hivejdbc-1.2.1
,但不幸的是没有帮助…ID:50857966谢谢:)好吧,我试着使用放置在我的一个数据节点中的jar,现在似乎从数据中提取的模式包含了正确的列名(
columnName
而不是
tableName\u columnName
)但返回的数据仍然损坏..我有4000多行
dt为null
。找到了一个解决方案:)