Regex 在配置单元创建中获取空值(&A);使用正则表达式加载查询
我有一个日志文件,需要在其中使用REGEX存储数据。我尝试了下面的查询,但加载了所有空值。我已经检查了正则表达式,它可以很好地处理我的数据Regex 在配置单元创建中获取空值(&A);使用正则表达式加载查询,regex,hadoop,null,hive,Regex,Hadoop,Null,Hive,我有一个日志文件,需要在其中使用REGEX存储数据。我尝试了下面的查询,但加载了所有空值。我已经检查了正则表达式,它可以很好地处理我的数据 CREATE EXTERNAL TABLE IF NOT EXISTS avl(imei STRING,packet STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe' WITH SERDEPROPERTIES
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
谢谢。根据您当前的表定义,任何正则表达式都不能满足您的要求。原因是您的文件格式设置为TEXTFILE,这将在数据到达SerDe之前,按行分割输入文件(
\r
,\n
,或\r\n
)
然后,每一行分别传递给RegexSerDe,与您的regex匹配,任何不匹配的返回NULL。因此,使用存储为TEXTFILE的时,多行正则表达式将无法工作。这也是您收到所有NULL行的原因:因为并没有一行输入匹配整个正则表达式
这里的一个解决方案可能是预处理数据,使每个记录只在输入文件中的一行上,但这不是您所要求的
在配置单元中执行此操作的方法是使用不同的文件格式:
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
TextInputFormat从当前配置读取名为TextInputFormat.record.delimiter的配置变量。如果您使用的是TextInputFormat,则此变量会告诉Hadoop和Hive一条记录的结束位置和下一条记录的开始位置
因此,将此值设置为类似于EOR
的值意味着输入文件在EOR
上拆分,而不是按行拆分。然后,分割生成的每个块将作为一个整体块、换行符和all传递给RegexSerDe
可以在多个位置设置此变量,但如果此变量仅是此(以及会话中的后续)查询的分隔符,则可以执行以下操作:
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
,因为我们只获得了一条示例记录,并且我无法告诉您根据regex尝试捕获第二个字段
如果您可以提供这两个项目(包含>1条记录的样本数据,以及您试图为数据包捕获的内容),我可能可以提供更多帮助。目前,您的正则表达式与您提供的示例数据不匹配,甚至不匹配。尝试将“output.format.string”=%1$s%2$s”
更改为“output.format.string”=“imei:%1$s,数据包:%2$s”
。我现在不能测试相同的,但是让我们知道它是否仍然是一个问题。不起作用!还是空值…你想从你的文件中发布一个示例记录吗?你让它工作了吗?我也有同样的问题…我不知道你想在第二个领域捕捉什么。包裹的长度还是六边形?