使用配置单元在特定单词之前提取文本

时间:2017-09-08 06:41:34

标签: regex hadoop text hive

我的列中的数据如下所示:

  • Avenue 1 HE1 345 HOUSE 123.
  • FLAT 202 HRE2 D34 HOUSE 345。

  • DOOR 324 HA1 345 HOUSE 67

5

在所有情况下,我需要提取始终在6-7个字符之间变化的邮政编码。在HOUSE之前和邮政编码之间以及邮政编码之前总是有一个空格。

期望的输出:

  • HE1 345
  • HRE2 D34
  • HA1 345

我尝试过两次使用substring_index才知道hive不支持该功能。我几乎是Hive的新手。帮助和任何材料参考也将是一个伟大的姿态。

提前致谢。

2 个答案:

答案 0 :(得分:2)

您可以使用此正则表达式模式' (\\w+ \\w+) HOUSE'。这意味着一个空格,一个或多个单词字符,一个空格,一个或多个字符,一个空格,HOUSE。在括号中是要提取的组。集团指数为1.

<强>演示:

 select regexp_extract(s,' (\\w+ \\w+) HOUSE',1) 
from
(select 'Avenue 1 HE1 345 HOUSE 123.'  s union all
select 'FLAT 202 HRE2 D34 HOUSE 345.' s union all
select 'DOOR 324 HA1 345 HOUSE 67'    s) s;
OK
HE1 345
HRE2 D34
HA1 345
Time taken: 26.472 seconds, Fetched: 3 row(s)

对于不区分大小写的使用(?i)修饰符:

hive>
    >
    > select regexp_extract(s,' (\\w+ \\w+) (?i)HOUSE',1)
    > from
    > (select 'Avenue 1 HE1 345 HOUSe 123.'  s union all
    > select 'FLAT 202 HRE2 D34 HOUsE 345.' s union all
    > select 'DOOR 324 HA1 345 HOuSE 67'    s) s;
OK
HE1 345
HRE2 D34
HA1 345

请参阅此处的正则表达式文档:https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

关于不区分大小写:http://www.regular-expressions.info/modifiers.html

答案 1 :(得分:-4)

您可以将该文件另存为csv文件(将内容复制到记事本中并以.csv扩展名保存)。

现在,您可以在配置单元中创建表,并从表中的csv文件加载数据。

<强>蜂房&GT; create table text(column1 string,column2 string,column3 string,column4 string,column5 string,column6 string)以''; 结尾的行格式分隔字段 好 所用时间:0.137秒

将数据加载到表格中: 使用 的蜂房&GT;加载数据LOCAL inpath'你文件的位置'覆盖到表格文本;

蜂房&GT;在路径'/home/cloudera/FinalProjects/text.csv'中加载数据LOCAL覆盖到表格文本中; 将数据加载到表default.text 表default.text stats:[numFiles = 1,numRows = 0,totalSize = 84,rawDataSize = 0] 好 所用时间:0.59秒

<强>蜂房&GT;从文本中选择column3,column4; 好 HE1 345 HRE2 D34 HA1 345 所用时间:0.145秒,提取:3行