【问题标题】:Convert hive functions to java - translate and regexp_replace将 hive 函数转换为 java - translate 和 regexp_replace
【发布时间】:2013-07-27 09:35:47
【问题描述】:

1) 如何将下面的 hive 部分转换为 java map reduce?

 translate(regexp_replace(colA,"(\\\\=)","\\\\equalto"),"\[\]\(\)\{\}\^\?\+\*\$","____________") 

在 regexp_replace 中,我将替换所有 =,在外部翻译中,我将替换所有影响未来 regexp_replace 解析的字符。(如果我不替换这些字符,它们稍后会引发异常)。

2) 我是否必须使用replaceChars(),如果是,那么如何使用?

示例字符串格式为:

tag1=573 tag2=ABC 0nuif6d Saturn 0i899 AA 0 (WORD) LOWER 0 (WORD2) HH 0 BB 0 CC 1 LL 0 D 0 FF 0 AB 0 UPPER 0 (ONCOLD) UPPER 1 PART: Sold \= 88vb JJ number\= 0 String "String_here" ANDND JUJFNG fill EXTRA SUNSET: empty tag3=/Informational tag4=/Value tag5=Value1/Value2 tag6=/AB/Acs Sy/Api Afg Hold Cones/HHH+11: 4.3.2-4.3.4 tag6=11123 tag7=Hello World tag8=a-dfdAds\=\= tag9=Value3 tag.9=Space separated words \= 88 , cold 87 Goal Run\=2, LOT OF SPACE SEPARATED GARBAGE WORDS tag.a=0( tag.b=02

注意:标签不会硬编码为标签。它们可以是任何英文单词,如serial_number 或website.address,如serial_no=hello world website.address=\SO.com=/question,其中serial_nowebsite.address 是标签。

【问题讨论】:

  • 您能否提供一些示例文本,以帮助我们准确了解您的出发点以及最终产品的目标?
  • 好的。示例字符串格式是..(您可以忽略引号)...:'tag1=573 tag2=ABC 0nuif6d Saturn 0i899 AA 0 (WORD) LOWER 0 (WORD2) HH 0 BB 0 CC 1 LL 0 D 0 FF 0 AB 0 UPPER 0 (ONCOLD) UPPER 1 PART: Sold \= 88vb JJ number\= 0 String "String_here" ANDND JUJFNG fill EXTRA SUNSET: empty tag3=/Informational tag4=/Value tag5=Value1/Value2 tag6=/AB/Acs Sy /Api Afg Hold Cones/HHH+11: 4.3.2-4.3.4 tag6=11123 tag7=Hello World tag8=a-dfdAds\=\= tag9=Value3 tag.9=空格分隔的单词\= 88 , cold 87 Goal运行\=2,大量空格分隔的垃圾词 tag.a=0( tag.b=02'
  • 我想提取所有标签并将它们用制表符分隔“标签 \t 值”。为此,我将所有 '\=' 替换为 '\equalto' ,然后删除所有导致正则表达式失败的特殊字符,然后用 = 分割,然后获取每个分割的最后一个单词,这些是我的标签,然后对于我用空字符串“”替换每个部分中的最后一个单词的值。

标签: java regex parsing hadoop hive


【解决方案1】:

说明

这个表达式将:

  • 假设标签名称不包含空格
  • 假设标签名称通过= 与它们各自的值分开,= 符号的两边都没有空格,并且没有\ 继续
  • 假设标签名称与前面的字符串用空格分隔,同样值将与下一个标签名称用空格分隔
  • 捕获标签名称和值
  • 将避免在嵌入在字符串值侧的等号上拆分字符串

(\S*?)(?<!\\)=(\S*.*?)(?=\S*(?<!\\)=|\Z)

然后,您可以根据需要重新组合或进一步处理字符串的各个组件。

示例

Live Demo

示例文本

来自您在 cmets 中包含的示例文本。目前还不清楚是什么定义了标签或等号来分隔名称和值:

serial_no=hello world website.address=\SO.com=/question tag1=573 tag2=ABC 0nuif6d Saturn 0i899 AA 0 (WORD) LOWER 0 (WORD2) HH 0 BB 0 CC 1 LL 0 D 0 FF 0 AB 0 UPPER 0 (ONCOLD) UPPER 1 PART: Sold \= 88vb JJ number\= 0 String "String_here" ANDND JUJFNG fill EXTRA SUNSET: empty tag3=/Informational tag4=/Value tag5=Value1/Value2 tag6=/AB/Acs Sy/Api Afg Hold Cones/HHH+11: 4.3.2-4.3.4 tag6=11123 tag7=Hello World tag8=a-dfdAds\=\= tag9=Value3 tag.9=Space separated words \= 88 , cold 87 Goal Run\=2, LOT OF SPACE SEPARATED GARBAGE WORDS tag.a=0( tag.b=02

示例代码

import java.util.regex.Pattern;
import java.util.regex.Matcher;
class Module1{
  public static void main(String[] asd){
  String sourcestring = "source string to match with pattern";
    Pattern re = Pattern.compile("(\\S*?)(?<!\\\\)=(\\S*.*?)(?=\\S*(?<!\\\\)=|\\Z)",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);

  Matcher m = re.matcher(sourcestring);
  int mIdx = 0;
    while (m.find()){
      for( int groupIdx = 0; groupIdx < m.groupCount()+1; groupIdx++ ){
        System.out.println( "[" + mIdx + "][" + groupIdx + "] = " + m.group(groupIdx));
      }
      mIdx++;
    }
  }
}

匹配项

组 0 将包含整个子字符串 第 1 组将具有名称字段 第 2 组将具有值字段

[0][0] = serial_no=hello world 
[0][1] = serial_no
[0][2] = hello world 

[1][0] = website.address=\SO.com=/question
[1][1] = website.address
[1][2] = \SO.com=/question

[2][0] = tag1=573 
[2][1] = tag1
[2][2] = 573 

[3][0] = tag2=ABC 0nuif6d Saturn 0i899 AA 0 (WORD) LOWER 0 (WORD2) HH 0 BB 0 CC 1 LL 0 D 0 FF 0 AB 0 UPPER 0 (ONCOLD) UPPER 1 PART: Sold \= 88vb JJ number\= 0 String "String_here" ANDND JUJFNG fill EXTRA SUNSET: empty 
[3][1] = tag2
[3][2] = ABC 0nuif6d Saturn 0i899 AA 0 (WORD) LOWER 0 (WORD2) HH 0 BB 0 CC 1 LL 0 D 0 FF 0 AB 0 UPPER 0 (ONCOLD) UPPER 1 PART: Sold \= 88vb JJ number\= 0 String "String_here" ANDND JUJFNG fill EXTRA SUNSET: empty 

[4][0] = tag3=/Informational 
[4][1] = tag3
[4][2] = /Informational 

[5][0] = tag4=/Value 
[5][1] = tag4
[5][2] = /Value 

[6][0] = tag5=Value1/Value2 
[6][1] = tag5
[6][2] = Value1/Value2 

[7][0] = tag6=/AB/Acs Sy/Api Afg Hold Cones/HHH+11: 4.3.2-4.3.4 
[7][1] = tag6
[7][2] = /AB/Acs Sy/Api Afg Hold Cones/HHH+11: 4.3.2-4.3.4 

[8][0] = tag6=11123 
[8][1] = tag6
[8][2] = 11123 

[9][0] = tag7=Hello World 
[9][1] = tag7
[9][2] = Hello World 

[10][0] = tag8=a-dfdAds\=\= 
[10][1] = tag8
[10][2] = a-dfdAds\=\= 

[11][0] = tag9=Value3 
[11][1] = tag9
[11][2] = Value3 

[12][0] = tag.9=Space separated words \= 88 , cold 87 Goal Run\=2, LOT OF SPACE SEPARATED GARBAGE WORDS 
[12][1] = tag.9
[12][2] = Space separated words \= 88 , cold 87 Goal Run\=2, LOT OF SPACE SEPARATED GARBAGE WORDS 

[13][0] = tag.a=0( 
[13][1] = tag.a
[13][2] = 0( 

[14][0] = tag.b=02
[14][1] = tag.b
[14][2] = 02

【讨论】:

  • 很抱歉,我没有很好地显示示例字符串。谢谢你的回答。标签不是硬编码为标签,它可以是任何英文单词,比如'serial_no=hello world website.address=\SO.com=/question',其中serial_no和website.address是标签。
  • 我认为无法构建正则表达式来处理这个问题?
  • 太棒了!有用。我会在这方面做更多的工作,如果有任何问题,我会告诉你。谢谢你。 PS:如何开始培养制作此类正则表达式的技能?
  • 酷。使用正则表达式变得更好需要一些练习和一些学习。我建议从 regular-expressions.info/tutorial.html 这个网站开始,因为他们有一些非常棒(且简洁)的解释。了解基础知识后,您只需了解每种语言实现其正则表达式版本的方式之间的差异。
  • 这将是一个在 StackOver Flow 上提出新问题的好机会。该表达式可能无效,需要转义 ] 字符。
猜你喜欢
  • 1970-01-01
  • 2016-02-23
  • 2020-02-15
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
  • 1970-01-01
相关资源
最近更新 更多