Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在配置单元创建中获取空值(&A);使用正则表达式加载查询_Regex_Hadoop_Null_Hive - Fatal编程技术网

Regex 在配置单元创建中获取空值(&A);使用正则表达式加载查询

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

我有一个日志文件,需要在其中使用REGEX存储数据。我尝试了下面的查询,但加载了所有空值。我已经检查了正则表达式,它可以很好地处理我的数据

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”
。我现在不能测试相同的,但是让我们知道它是否仍然是一个问题。不起作用!还是空值…你想从你的文件中发布一个示例记录吗?你让它工作了吗?我也有同样的问题…我不知道你想在第二个领域捕捉什么。包裹的长度还是六边形?