我在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。
后来我尝试使用兼容的jar根据CDH版本,也没有解决它。
ExecuteSQL
处理器配置如下:
Normalize Table/Column Names
:true
Use Avro Logical Types
:false
Hive版本:1.1.0
CDH:5.7.1
任何想法发生了什么?谢谢!
编辑: 显然我的返回数据包括额外的行......几千个......这很奇怪。
答案 0 :(得分:0)
HiveJDBC4
(我假设Simba Hive驱动程序)是否从列名解析表名?这是一个与Apache Hive JDBC驱动程序不兼容的地方,它不支持getTableName()
因此不能与ExecuteSQL一起工作,即使这样做,也可以从中检索列名在ResultSetMetaData中,他们的表名前面加上句点.
分隔符。这是HiveJdbcCommon(由SelectHiveQL使用)和JdbcCommon(由ExecuteSQL使用)中的一些自定义代码。
如果您因为使用身份验证方法时遇到问题而尝试使用ExecuteSQL,那么Simba驱动程序有何缓解?您是否在JDBC URL上指定了auth信息,而不是在hive-site.xml文件中?如果您将您的身份验证问题(使用SelectHiveQL)作为一个单独的SO问题并在此处链接到该问题,我将尽我所能帮助您解决这个问题。
答案 1 :(得分:0)
最终,它通过使用蜂巢属性hive.query.result.fileformat=SequenceFile