根据您当前的表定义,任何正则表达式都无法满足您的要求。原因是你的 file_format 设置为TEXTFILE,按行分割输入文件(\r
, \n
, or \r\n
),在数据到达 SerDe 之前。
然后将每一行单独传递到正则表达式串行器,与您的正则表达式匹配,任何不匹配的返回NULL。因此,多行正则表达式将无法使用STORED AS TEXTFILE
。这也是您收到全部的原因NULLrows:因为没有任何一行输入与您的整个正则表达式匹配。
这里的一种解决方案可能是预处理数据,使每条记录仅位于输入文件中的一行,但这不是您所要求的。
在 Hive 中执行此操作的方法是使用不同的 file_format:
STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat'
TextInputFormat 从当前配置中读取名为的配置变量文本输入格式.记录.分隔符。如果您正在使用文本输入格式,此变量告诉 Hadoop 和 Hive 一条记录的结束位置和下一条记录的开始位置。
因此,将此值设置为类似EOR
意味着输入文件被分割EOR
,而不是按行。分割生成的每个块将作为整个块、换行符等传递给 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
,因为我们只给出了一个示例记录,并且我无法根据您的正则表达式判断您要尝试捕获第二个字段。
如果您能提供这两项(具有 >1 条记录的示例数据,以及您要捕获的内容packet),也许我能帮上更多忙。就目前情况而言,您的正则表达式与您提供的示例数据不匹配——甚至不匹配您链接的网站 http://regexr.com/3cogg.