【问题标题】:Hive - Use of replace or regexp_replace function for multiple replace conditionsHive - 对多个替换条件使用 replace 或 regexp_replace 函数
【发布时间】:2018-08-22 08:46:27
【问题描述】:

我正在使用 Hive 并尝试清理可能包含多个不需要的数据的数据。想知道我是否可以对多个条件使用单个 regexp_replace 或 translate 函数。

例如。如果字符串是2000 Helen St - DO NOT USE 我需要替换/修剪- DO NOT USE 并将St 更改为Street。 输出应该是2000 Helen Street

同样

  • 3000 Cross St 应该是 3000 Cross Street
  • 4000 Mascot Dr 应该是 4000 Mascot Drive
  • 等等..

大约有 10 个或更多这样的清理条件,输入字符串可以满足 0 个或多个条件条件。可以在单个regexp_replace 中设置这些条件吗?

【问题讨论】:

  • 你能举一些清理条件的例子吗?还包括您迄今为止的尝试。
  • 对我来说,似乎您将有一套转换规则,并且多次使用regexp_replace 不应该是clean 解决方案。而是考虑编写一个简单的GenericUDF,它可以处理所有情况。并且它带有Java的强大功能,因此有无限可能清理所有类型的数据。

标签: replace hive regexp-replace


【解决方案1】:

您可以使用 OR (|) 轻松组合模板以删除子字符串或替换为相同的值。在其他情况下,使用多个 regexp_replace:

例如,如果您想删除“TEST”和“- DO NOT USE”并将“Dr”替换为“Street”:

hive> select regexp_replace(
                  regexp_replace('TEST 2000 Helen St - DO NOT USE',
                                 '[- ]*DO NOT USE|TEST( *|$)',''),
                          'St([ ]*|$)','Street'  
                  );
OK
2000 Helen Street
Time taken: 0.055 seconds, Fetched: 1 row(s)

它删除了“TEST”和“- DO NOT USE”——它们组合成一个模板。 'St' 替换为 'Street' - 这是第二个 regexp_replace。 当然这只是示例。

【讨论】:

  • 我认为您可以简单地使用嵌套的replace 而不是regexp_replace
  • @VamsiPrabhala 也许,这取决于模式的复杂性
  • 这也取决于你运行的 Hive 版本——旧版本没有replace
猜你喜欢
  • 1970-01-01
  • 2020-04-11
  • 2016-02-23
  • 2015-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
相关资源
最近更新 更多