Hive数据清洗中常见的几个字符串处理函数
在Hive中,数据清洗是一个重要的任务之一,通常涉及到对数据进行过滤、修改和转换等操作,以使其更易于使用和分析。常用的数据清洗技术包括:数据去重、空值填充、数据格式化、数据类型转换、数据分区等。这里简单记录几个常用的数据清洗函数,后期会继续增加。
1.空格处理 trim()
trim() 函数是一种字符串处理函数,用于删除字符串左右两侧的空格它的语法如下:
trim(string1)
其中 string1 是要处理的字符串
例如,下面这个 SELECT 语句会删除字符串 ’ Hello, World! ’ 两侧侧的空格:
SELECT trim(' Hello, World! ')AS new_string;
查询结果会返回新的字符串 ‘Hello, World!’,两侧的空格已经被删除了。
2.字符串分割 split()
在 Hive 中,split() 函数用于将一个字符串按照给定的分隔符拆分成一个数组或多个字段。它的语法如下:
split(str, pattern)
其中,str 表示要拆分的字符串,pattern 表示分隔符,可以是正则表达式。
例如,下面这个查询会将字符串按照逗号分隔成一个数组:
SELECT split('foo,bar,baz',',')AS result;
查询结果为 [“foo”,“bar”,“baz”]
如果希望将字符串拆分成多个字段,可以使用 LATERAL VIEW 和 explode() 函数进行处理:
SELECT
id,valueFROM my_table
LATERAL VIEW explode(split(my_column,',')) my_table_expanded ASvalue;
这个查询会将 my_table 表中 my_column 列的值按照逗号分隔成多个值,并将每个值作为一行输出,每一行包含一个 id 和一个 value。
注意:split() 函数在处理中文字符时可能存在问题,因为中文字符在 Hive 内部是以 UTF-8 编码进行处理的。如果需要处理中文字符,请确认数据的编码格式,或者使用其他适合中文字符处理的函数。
3.无用符处理 regexp_replace()
regexp_replace() 函数是一种字符串处理函数,可以替换符合正则表达式的字符串为新的字符串。
在使用 regexp_replace() 函数时,需要指定三个参数:原字符串、正则表达式和替换后的字符串。示例代码如下:
SELECT regexp_replace('I dodged the rain , of the secular world.','[.]','!')AS new_name;
这个查询将会把 “I dodged the rain of the secular world.” 中的逗号和句号替换为感叹号,输出结果为 “I dodged the rain ! of the secular world!”。
正则表达式 “[,.]” 匹配逗号和句号,这个正则表达式中的方括号表示一个字符集。它的含义是和方括号里的任意一个字符匹配,也就是说,逗号或者句号都可以被匹配。
另外,还可以使用 regexp_replace() 函数来删除某些字符串。比如下面这个例子,将会删除表 fccont 中的 contno 字段中所有的数字和中划线:
UPDATE fccont SET contno = regexp_replace(contno,'[0-9-]','');
需要注意的是,使用正则表达式时应该仔细检查,确保不会误匹配或漏匹配字符串,避免产生不必要的错误。
4.字符串拼接
concat()
在Hive中,concat() 是一个字符串函数,用于将两个或多个字符串连接在一起。
函数的语法如下:
concat(string1, string2,..., stringN)
其中,string1到stringN是要连接的字符串,可以是实际的字符串值或表示列名的变量。
下面是一个使用concat()函数的示例,将first_name和last_name列连接成一个字符串:
SELECT concat('Hello',' ','World!')AS new_name
结果如下所示:
+---------------+
| new_name |
+---------------+
| Hello World!|
+---------------+
concat_ws()
在Hive中,还有一个concat的进阶函数 **concat_ws()**,用于合并多个列,将它们连接成一个单独的字符串,并使用分隔符将它们分隔开来。
函数的语法如下:
concat_ws(separator,[string1, string2,..., stringN])
其中,separator是用于连接列的分隔符,可以是任何字符串,如逗号、空格、短划线等。string1到stringN是要连接的字符串,可以是实际的字符串值或表示列名的变量。
下面是一个使用concat_ws()函数的示例,将first_name、last_name和email列连接成一个逗号分隔的字符串:
SELECT concat_ws(',','Hello','World','!')AS new_info
这将产生一个结果集,如下所示:
+-------------------+
| new_info |
+-------------------+
| Hello,World,!|
+-------------------+
通过将列连接成一个字符串,可以更轻松地进行数据清理、转换和导出到外部系统等操作。
5.获取json字段里的字符 get_json_object()
**get_json_object()**是一种在JSON格式字符串中获取指定字段值的函数,主要用于处理JSON数据。在Hive和Spark SQL中都支持使用该函数来处理JSON数据。
get_json_object() 的语法通常为:get_json_object(json_string, json_path)
其中:
json_string参数为待解析的JSON格式字符串。
json_path参数为JSON字段的路径。
例子:
SELECT get_json_object('{"name":"我躲过世俗的雨", "age":18, "city":"Hang Zhou"}','$.name')AS`结果`;
在这个例子中,我们获取JSON字符串中名为name的字段值,即返回字符串John。
注意 :如果待解析的JSON格式字符串无法解析,或者指定的JSON路径无效,则会返回NULL值。
6.字符串搜索函数 regexp_extract()
regexp_extract() 是一种在字符串中搜索模式并返回匹配文本的函数。在SQL和多种编程语言中都支持使用正则表达式做字符串匹配。
regexp_extract()的语法通常为:regexp_extract(string, regex_pattern, index)
其中:
- string 参数为待搜索的字符串。
- regex_pattern 参数为匹配模式的正则表达式。
- index 参数表示从模式匹配结果中返回哪个捕获组的结果。捕获组指的是在正则表达式中使用括号的部分。 如果待搜索的字符串与模式不匹配,或者没有指定的捕获组,regexp_extract()函数则会返回NULL值。
这里先举一个例子:
例如 我想在一堆字符串中(‘参数,WechatEventStateContext(wedd,1234):(mobile=17899998877, userId=null),s13456sssf{}’)找出 17899998877 这一手机号可以这么写:
SELECT regexp_extract('参数,WechatEventStateContext(wedd,1234):(mobile=17899998877, userId=null),s13456sssf{}','[^0-9](1[0-9]{10})[^0-9]',1)AS`结果`;
这里解释一下正则表达式
[^0-9](1[0-9]{10})[^0-9][^0-9]:匹配任何一个非数字字符。
(1[0-9]{10}):匹配以数字1开头,后面跟着10个数字0-9的字符串组合,即一个11位的手机号码。
[^0-9]:匹配一个非数字字符,以确保手机号前后不会有额外的数字字符或汉字等字符混入。
这里提到了正则表达式,也顺便记一下吧,也不用完全背下来,到时候照着码就行。
正则表达式(Regular Expression) 是一种用于描述字符串规律的表达式,它在文本处理、计算机语言分析等领域都有广泛的应用。正则表达式通常由一系列字符及字符组成的模式或表达式组成,用来匹配特定的字符串。
在正则表达式中常用的有以下几种元字符及其含义:
. 匹配任意单个字符。
* 匹配前面的零个或多个字符。
+ 匹配前面的至少一个或多个字符。
? 匹配前面的零个或一个字符。
^ 匹配字符串的开头。
$ 匹配字符串的结尾。
[] 匹配字符集中的任意一个字符。
[a-z] 匹配小写字母a到z中的任意一个字符。
[A-Z] 匹配大写字母A到Z中的任意一个字符。
\d 匹配任何一个数字字符。
\w 匹配任何一个字母、数字或下划线字符。
\s 匹配任何一个空格字符。
除了上述常用的元字符之外,正则表达式还支持很多其它的特殊字符和组合方式,用于描述更复杂的字符串规律。在实际应用中,需要结合具体场景和需求,选择合适的正则表达式来实现对字符串的处理和匹配。
以上为本次分享的几个函数,后续会继续增加。
版权归原作者 我躲过世俗的雨 所有, 如有侵权,请联系我们删除。