当前位置: 首页 > news >正文

Hive工作所遇问题之Hive -e命令中使用正则表达式问题

前言

今天工作因为之前建表时,看不到数据,导致建表的字段格式有问题,然后使用split函数拆分时,发现是正则表达式使用的问题。

下面来说明问题

一、数据准备

--创建码表:
create table hive_sql.d_type(
type_id string,
type string
)
stored as orc

--插入数据:
insert into table hive_sql.d_type
select '1','居民身份证' union  all
select '10','居民户口簿' union  all
select '11','驾驶证' union  all

--创建建表有问题的表:types 应该是字符串,但因为以前系统的人使用的浮点型
create table hive_sql.agent_type(
name string,
types decimal(22,3)
)
stored as orc

--插入数据
insert into table hive_sql.agent_type
select '张三',1
union all
select '李四',1

二、问题复现及解决方案

2.1、问题复现

2.1.1、源库(历史库)查询及问题说明

注:因为时间有限,就使用Hive中的表模拟

 

因为这个涉及到自动类型转换的问题,所以历史库或者Hive中都没有出现问题。但是实际工作过程中数据库的查询引擎是Impala,因为a表的types字段和b表的type_id类型不一致,必须使用cast转换,所以处理下面的问题:

types是1.000和1不匹配,导致张三和李四的证件类型都取不到,只能拆分:

这个能取到,没有任何问题,但是生产上用的是Hive -e的方式执行:

bin/hive -e "select a.name,b.type
 from (select a.*
      ,split(cast(a.types as string),'\\.')[0] types_new
 from hive_sql.agent_type a) a
  left join hive_sql.d_type b
   on a.types_new = b.type_id"

结果如下:证件类型又取不到了

 

2.2、问题原因说明

Hive 是基于 Java 的,而 Java 字符串中反斜杠 \ 本身需要转义。因此在 Hive 中,要表示正则表达式的 \\.,需要写成 \\\\.

当通过 hive -e 在命令行中执行时,Shell 会先解析参数中的引号和反斜杠。如果直接在 Shell 中写 \\.,Shell 会将其解析为 \.(实际传递到 Hive 的参数会丢失一个反斜杠)。因此需要额外增加一层转义:

  • 在 Shell 中,\\\\. → 实际传递给 Hive 的字符串是 \\. → 在 Hive 中解析为 \. → 正则引擎最终视为 . 的转义。

修正后的逻辑:

bin/hive -e "select a.name,b.type
 from (select a.*
      ,split(cast(a.types as string),'\\\\.')[0] types_new
 from hive_sql.agent_type a) a
  left join hive_sql.d_type b
   on a.types_new = b.type_id"

结果:

相关文章:

  • 【C++笔记】C++IO流的深度剖析
  • MATLAB R2024b安装及激活方法
  • C++ stack容器总结
  • 数字转换(c++)
  • 小样本微调大模型
  • 【Go万字洗髓经】Golang中sync.Mutex的单机锁:实现原理与底层源码
  • 一文速通Python并行计算:03 Python多线程编程-多线程同步(上)—基于互斥锁、递归锁和信号量
  • 3.3 Taylor公式
  • ROC 曲线与 AUC 计算:模型评估的深度解析
  • Spring----ioc
  • 解读GM2D二维码在线平台:全球二维码迁移计划的创新
  • WEB安全--SQL注入--利用log写入webshell
  • 您的数据是如何出现在暗网上的?
  • 深度学习论文: Image Segmentation Using Text and Image Prompts
  • 2025年IT行业技术革命全景解析:从AI到量子计算的落地实践
  • C - 创建初级通讯录(详细解析一)
  • MySQL--主从复制--原理
  • (UI自动化测试web端)第三篇:元素的常用操作方法_浏览器操作
  • QT编程之CAN协议
  • DeepSeek与GPT的全方位对比及其为编程工作带来的巨大变革
  • 以色列媒体:以总理称将接管整个加沙
  • 音著协宣布胜诉,虎牙公司终审被判侵权
  • 以色列总理:以哈谈判内容包括“结束战争的框架”
  • 竞彩湃|英超欧冠悬念持续,纽卡斯尔诺丁汉能否拿分?
  • 3月中国减持189亿美元美债、持仓规模降至第三,英国升至第二
  • 严打金融黑灰产,今年来上海警方破获各类经济犯罪案件690余起