【问题标题】:ExecuteSQL processor returns corrupted dataExecuteSQL 处理器返回损坏的数据
【发布时间】:2018-06-11 07:21:37
【问题描述】:

我在 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 配置为使用HiveJDBC4 jar。 后来我根据CDH版本尝试使用兼容的jar,也没有修复。

ExecuteSQL 处理器配置如下:

Normalize Table/Column Names:true

Use Avro Logical Types:false

Hive 版本:1.1.0

CDH:5.7.1

有什么想法吗?谢谢!

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

【问题讨论】:

  • 很确定这是 jdbc 驱动程序的问题。您能否检查其他基于 jdbc 的工具返回的结果集。例如,您可以使用squirrel-sql 并尝试执行相同的查询。
  • 您可能还想尝试 SelectHiveQL 而不是 ExecuteSQL,前者已经包含 Hive 1.2.1 驱动程序,后者不“正式”支持 Hive,即使使用第三方驱动程序
  • @daggett 好点,我没有尝试更改驱动程序。我目前正在使用HiveJDBC4,但我会尝试不同的版本。
  • @mattyb 其实我一开始就尝试过使用hive-nar,但是在我的hadoop 集群和hive 中使用我的身份验证方法时遇到了问题。所以我宁愿使用 ExecuteSQL 处理器,这样它也可以通用

标签: hive apache-nifi


【解决方案1】:

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

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

【讨论】:

  • 实际上是的,它会将其转换为my_table_columnName。我可能真的会提出一个关于 Hive 问题的问题。谢谢我尝试从HiveJDBC4 切换到hivejdbc-1.2.1,但不幸的是它没有帮助...
  • ID: 50857966 谢谢:)
  • 好吧,我尝试使用放置在我的一个数据节点中的 jar,现在从数据中提取的模式似乎包含正确的列名(columnName 而不是 tableName_columnName ) 但返回的数据仍然损坏.. 我有超过 4000 行 dt is null..
  • 找到了解决方案:)
【解决方案2】:

最终通过使用配置单元属性hive.query.result.fileformat=SequenceFile解决了

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 2019-09-23
    • 2015-11-13
    相关资源
    最近更新 更多