Hive中如何用正则表达式提取字段里的DataProgram与ModelYear
使用Hive regex_extract提取DataProgram和ModelYear
当然可以用regex_extract实现这个需求!这恰好是正则表达式在Hive中提取结构化文本字段的典型场景,我结合你的示例数据给你具体的实现方案:
先拆解字段规律
从你给出的两个示例:
数据1: GD391P_JIK_2019MY_PRISM_DEPSpec.csv
数据2: T811P_2020MY_AA_DEPSpec.csv
能看出两个关键规律:
- ModelYear:总是四位数字,后面紧跟
MY(比如2019、2020) - DataProgram:是文件名开头到
_YYYYMY之前的所有内容(比如GD391P_JIK、T811P)
具体的regex_extract实现
1. 提取ModelYear
我们可以用正则匹配“四位数字+MY”的组合,捕获其中的四位数字:
regex_extract(filename, '(\\d{4})MY', 1) AS ModelYear
- 正则解释:
(\\d{4})捕获连续四位数字,MY匹配固定后缀,1表示取第一个捕获组的内容。
2. 提取DataProgram
我们需要匹配从文件名开头到_YYYYMY之前的所有内容,用非贪婪匹配来确保不会多取:
regex_extract(filename, '^(.*?)_\\d{4}MY', 1) AS DataProgram
- 正则解释:
^匹配字符串开头(.*?)非贪婪匹配任意字符(直到遇到后面的_\\d{4}MY就停止)_\\d{4}MY匹配分隔符(下划线+四位数字+MY)1取第一个捕获组的内容
完整Hive SQL示例
把这两个提取逻辑整合到查询中:
SELECT filename, regex_extract(filename, '^(.*?)_\\d{4}MY', 1) AS DataProgram, regex_extract(filename, '(\\d{4})MY', 1) AS ModelYear FROM your_table_name;
测试你的示例数据,得到的结果会是:
| filename | DataProgram | ModelYear |
|---|---|---|
| GD391P_JIK_2019MY_PRISM_DEPSpec.csv | GD391P_JIK | 2019 |
| T811P_2020MY_AA_DEPSpec.csv | T811P | 2020 |
完全符合你的需求!如果后续有其他类似的文本提取需求,只要找到固定的分隔规律,用regex_extract都能轻松解决。
内容的提问来源于stack exchange,提问作者Irthiza Khan
相关产品推荐
相关产品推荐

