regex - 使用 REGEX 在 Hive Create 和 Load Query 中获取空值

标签 regex hadoop null hive

我有一个日志文件,我需要在其中使用 REGEX 存储数据。我尝试了下面的查询,但加载了所有 NULL 值。我已经用 http://www.regexr.com/ 检查了正则表达式,它对我的​​数据工作正常。

CREATE EXTERNAL TABLE IF NOT EXISTS avl(imei STRING,packet STRING)                        
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (                                             
"input.regex" = "(IMEI\\s\\d{15} (\\b(\\d{15})([A-Z0-9]+)) )",          
"output.format.string" = "%1$s %2$s"                              
)
STORED AS TEXTFILE;

LOAD DATA INPATH 'hdfs:/user/user1/data' OVERWRITE INTO TABLE avl;

请在这里指正。

示例日志:

[INFO_|01/31 07:19:29]  IMEI 356307043180842 
[INFO_|01/31 07:19:33]  PacketLength = 372
[INFO_|01/31 07:19:33]  Recv HEXString : 0000000000000168080700000143E5FC86B6002F20BC400C93C6F000FF000E0600280007020101F001040914B34238DD180028CD6B7801C7000000690000000143E5FC633E002F20B3000C93A3B00105000D06002C0007020101F001040915E64238E618002CCD6B7801C7000000640000000143E5FC43FE002F20AA800C9381700109000F06002D0007020101F001040915BF4238D318002DCD6B7801C70000006C0000000143E5FC20D6002F20A1400C935BF00111000D0600270007020101F001040916394238B6180027CD6B7801C70000006D0000000143E5FBF5DE002F2098400C9336500118000B0600260007020101F0010409174D42384D180026CD6B7801C70000006E0000000143E5FBD2B6002F208F400C931140011C000D06002B0007020101F001040915624238C018002BCD6B7801C70000006F0000000143E5FBAF8E002F2085800C92EB10011E000D06002B0007020101F0010409154C4238A318002BCD6B7801C700000067000700005873

谢谢。

最佳答案

使用您当前的表定义,没有任何正则表达式可以满足您的要求。原因是您的 file_format 设置为 TEXTFILE,它按行(\r\n\r\n),在数据到达 SerDe 之前。

每一行然后单独传递给 RegexSerDe,与您的正则表达式匹配,任何不匹配的返回 NULL。因此,多行正则表达式将无法使用 STORED AS TEXTFILE。这也是您收到所有 NULL 行的原因:因为没有一行输入与您的整个正则表达式匹配。

此处的一种解决方案可能是预处理数据,使每条记录仅在输入文件中的一行上,但这不是您所要求的。

在 Hive 中执行此操作的方法是使用不同的 file_format:

STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'

TextInputFormat 从当前配置中读取一个名为textinputformat.record.delimiter 的配置变量。如果您使用的是 TextInputFormat,此变量会告知 Hadoop 和 Hive 一条记录的结束位置和下一条记录的开始位置。

因此,将此值设置为类似 EOR 的值将意味着输入文件在 EOR 上拆分,而不是按行拆分。拆分生成的每个 block 然后将作为一个整体 block 、换行符和全部传递给 RegexSerDe。

你可以在很多地方设置这个变量,但如果这是唯一的这个(以及 session 中的后续)查询的分隔符,那么你可以这样做:

SET textinputformat.record.delimiter=EOR;

CREATE EXTERNAL TABLE ...
...
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
   "input.regex" = ...
   "output.regex" = ...
)
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
          OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION ...;

在您的特定场景中,我无法告诉您您可能使用什么来代替 textinputformat.record.delimiter 而不是 EOF,因为我们只给出了一个示例记录,而且我无法根据您的正则表达式判断您要捕获哪个字段。

如果您可以提供这两项(具有 >1 条记录的示例数据,以及您尝试为数据包捕获的内容),我也许可以提供帮助过多。就目前而言,您的正则表达式与您提供的示例数据不匹配——甚至在 the site you linked 上也不匹配。 .

关于regex - 使用 REGEX 在 Hive Create 和 Load Query 中获取空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23668713/

相关文章:

python - sre_constants.错误: unexpected end of regular expression - Should Work Fine

javascript - 如何捕获不对称表达末尾的重复组

regex - Eclipse 文件搜索正则表达式以包含搜索短语并排除特定字符串

function - 对于获取对象但可能找不到它的函数,最好的 func 签名是什么?

右表中的 MySQL Left Join 和 NULL 列

Javascript - 添加验证模式以允许至少一个非空格字符

Hadoop - 将 reducer 编号设置为 0 但写入同一文件?

hadoop - 无法在 hadoop 2.6.5 安装中找到 etc 文件夹

hadoop - 究竟是什么?

arrays - 将未嵌套的空值数组插入 double 列,postgresql