ExecuteSQL 处理器返回损坏的数据



我在NiFI中有一个流程,其中我使用ExecuteSQL处理器从hive表中获取名为dt的子分区的完整合并。例如:我的表按sikiddt进行分区。所以我在sikid=1, dt=1000sikid=2, dt=1000下. 我所做的是select * from my_table where dt=1000.

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

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

ExecuteSQL处理器的配置如下:

Normalize Table/Column Namestrue

Use Avro Logical Typesfalse

配置单元版本:1.1.0

CDH:5.7.1

知道发生了什么吗?谢谢!

编辑: 显然我返回的数据包括额外的行...几千个..这很奇怪。

HiveJDBC4(我假设 Simba Hive 驱动程序(是否从列名中解析表名?这是一个与Apache Hive JDBC驱动程序不兼容的地方,它不支持getTableName()所以不适用于ExecuteSQL,即使它这样做,当从ResultSetMetaData检索列名时,它们的表名前面加上句点.分隔符。这是HiveJdbcCommon(由SelectHiveQL使用(与JdbcCommon(由ExecuteSQL使用(中的一些自定义代码。

如果您尝试使用 ExecuteSQL 是因为身份验证方法出现问题,那么如何使用 Simba 驱动程序缓解这种情况?例如,您是否在 JDBC URL 上指定身份验证信息,而不是在配置单元站点.xml文件中指定身份验证信息?如果您将身份验证问题(使用 SelectHiveQL(作为单独的 SO 问题提出并在此处链接到它,我将尽我所能在这方面提供帮助并让您通过这个问题。

最终通过使用Hive 属性hive.query.result.fileformat=SequenceFile来解决

最新更新