我在NiFI中有一个流程,其中我使用ExecuteSQL处理器从hive
表中获取名为dt的子分区的完整合并。例如:我的表按sikid
和dt
进行分区。所以我在sikid=1, dt=1000
和sikid=2, dt=1000
下. 我所做的是select * from my_table where dt=1000
.
不幸的是,我从 ExecuteSQL 处理器得到的回报是损坏的数据,包括具有dt=NULL
的行,而原始表甚至没有一行 dt=NULL。
DBCPConnectionPool
配置为使用HiveJDBC4
jar。 后来我尝试根据 CDH 版本使用兼容的 jar,也没有修复它。
ExecuteSQL
处理器的配置如下:
Normalize Table/Column Names
:true
Use Avro Logical Types
:false
配置单元版本: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
来解决