HIVE异常处理(三)关于字段和hive中的预留字段冲突的问题

本文介绍在使用Hive创建表时遇到字段名或表名与内部关键字冲突的问题及两种解决方案:通过加反引号区分关键字或调整hive-site.xml配置文件中的hive.support.sql11.reserved.keywords选项。

1、如果你的hive建表的时候的字段会和hive的关键字重复的话,那么执行hql的时候会报错。
创建表出现如下错误(表字段或表名与hive内部的关键字冲突了(e.g:order,date……)等,

FAILED: ParseException line 6:0 Failed to recognize predicate ‘date’. Failed rule: ‘identifier’ in column specification

有两种解决方案:
(1). 在关键字处加反引号 可以解决,同时查询时也要加反引号。e.g:select * fromdate` where age>20;

(2). 需要设置一下变量即可解决(hive2.1一下的版本应该是可以的至于和hive2.3没试过):
set hive.support.sql11.reserved.keywords=false; 也可以将hive-site.xml配置文件中的此选项改为false,让它始终生效。 以上配置将忽略关键字冲突。

eg:在conf下的hive-site.xml配置文件中修改配置选项:

hive.support.sql11.reserved.keywords false
<think>嗯,用户遇到了Nifi高版本中缺少PutHiveQL处理器的问题,需要替代方案。从引用内容看,用户环境是CDH集群的Hive 1.1,但Nifi自带的hive-nar包却是1.2版本,存在兼容性问题。用户的核心诉求是如何在缺少专用处理器的情况下组装并执行HQL写入Hive。 用户引用材料提供了关键线索:引用[2]说明PutHiveQL的本质是执行HiveQL命令,引用[3][4]则提示NiFi有近300个处理器可组合使用。这说明完全可以通过基础处理器拼装出等效功能。 最直接的方案是用ExecuteSQL处理器配合JDBC连接池。因为: 1. PutHiveQL底层本就是JDBC连接,引用[2]提到它支持参数化SQL(hiveql.args.N.type/value) 2. ExecuteSQL同样支持JDBC连接HiveServer2,且参数化更灵活(?占位符+属性映射) 3. 版本兼容性更好,只需确保hive-jdbc驱动匹配 另一个思路是GenerateTableFetch+FetchHDFS组合,但引用[4]说明这更适合批量导文件而非执行DML。用户明确要"执行写入",所以JDBC方案更贴切。 需要提醒用户注意两点:一是Hive事务支持(ACID)需目标表为ORC格式且开启配置;二是避免频繁小事务提交,建议批次处理。如果用户需要实时流写入,可能还要考虑Kafka+Hive Streaming的方案,但这超出当前问题范围。 最后预留了优化空间:当写入吞吐量高时,可配合PutDistributedMapCache实现批次聚合,避免每条数据都触发JDBC连接。 </think>在 Nifi 高版本缺少 `PutHiveQL` 处理器时,可以通过组合其他核心处理器实现SQL组装与写入Hive的功能。以下是具体方案及步骤: --- ### **解决方案:使用核心处理器组合替代`PutHiveQL`** #### **1. 数据流设计** ```mermaid graph LR A[数据源] --> B(GenerateFlowFile/ExecuteSQL) B --> C(ReplaceText/QueryRecord) C --> D(ExecuteSQL) D --> E[成功写入Hive] ``` #### **2. 关键步骤说明** 1. **SQL组装** - **方案1:动态模板** 使用 `ReplaceText` 处理器(需 Apache NiFi 1.12.0+): ```plaintext Processor: ReplaceText Replacement Strategy: Regex Replace Search Value: (.*) Replacement Value: INSERT INTO ${hive.table} VALUES('${field1}',${field2}); ``` *说明*:通过正则捕获原始数据,用表达式 `${attribute}` 动态替换占位符[^3][^4]。 - **方案2:结构化转换** 使用 `QueryRecord` 处理器(需定义Avro/JSON Schema): ```sql SELECT CONCAT('INSERT INTO target_table VALUES(', field1, ',', TO_STRING(field2), ')') AS sql_cmd FROM FLOWFILE ``` *优势*:支持复杂数据类型转换条件逻辑[^3]。 2. **执行SQL** 配置 `ExecuteSQL` 处理器: - **连接池**:创建 `DBCPConnectionPool` 指向 HiveServer2 (JDBC URL: `jdbc:hive2://<host>:10000/default`)。 - **SQL语句来源**:选择 `flowfile-content` 直接执行FlowFile中的SQL命令。 - **提交策略**:设置 `Batch Size` 批量提交提升性能(建议值:1000-5000)[^2][^4]。 #### **3. 兼容性处理** - **驱动冲突**: 若遇版本不兼容(如引用[1]中Hive 1.1 vs 1.2),手动上传匹配的JDBC驱动: 1. 将 `hive-jdbc-<version>-standalone.jar` 放入 `$NIFI_HOME/lib`。 2. 在 `DBCPConnectionPool` 中指定驱动类名:`org.apache.hive.jdbc.HiveDriver`。 - **事务支持**: Hive写入需开启ACID(Transactional表)或采用分区覆盖: ```sql INSERT OVERWRITE TABLE table PARTITION(dt='${date}') ... ``` #### **4. 完整示例流程** ```plaintext GenerateFlowFile (生成测试数据) ↓ AttributesToJSON (转换字段为JSON) ↓ ReplaceText (模板: {"sql":"INSERT INTO table VALUES('${field1}',${field2})"}) ↓ ExtractText (提取"sql"字段内容到FlowFile主体) ↓ ExecuteSQL (连接HiveServer2执行) ↓ LogAttribute (记录执行结果) ``` --- ### **性能优化建议** 1. **批量写入** 通过 `MergeContent` 合并多个FlowFile后再执行,减少JDBC连接开销[^4]。 2. **错误处理** 添加 `Retry` `RouteOnAttribute` 处理器捕获SQL异常(如 `sql.error.message`)。 3. **Kerberos认证** 若集群启用安全认证,在 `DBCPConnectionPool` 中配置JAAS或Keytab[^2]。 --- ### **替代方案对比** | **方案** | 适用场景 | 复杂度 | 性能 | |--------------------|-------------------------|--------|-------| | ExecuteSQL+模板 | 简单插入/更新 | ★★☆ | 高 | | QueryRecord+ExecuteSQL | 复杂转换逻辑 | ★★★ | 中高 | | PutHiveStreaming | 实时流写入(需Hive 3.4+)| ★☆ | 最高 | > ⚠️ 注意:`PutHiveStreaming` 是NiFi 1.15+新增的专用Hive写入处理器,若环境允许升级可直接使用[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值