regex - 表格中的 HIVE 正则表达式记录定界符空值

标签 regex hadoop hive deserialization

请找到我的表格描述、Serde 和日志格式。

create table temp.rawserversidedata

(
ip varchar(65000),
dt varchar(65000),
apiname varchar(65000),
appname varchar(65000),
contentid  varchar(65000),
eid varchar(65000),
version varchar(65000),
uid varchar(65000),
model varchar(65000)
)

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
WITH SERDEPROPERTIES  (
"input.regex" = "([0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,})(.*)(getstream.*)(appname=.*)(content_id=[0-9]{1,}.*)(eid=[0-9].*)(version=[(\d+\.?)]*)(.*uid=[0-9]{1,})(.*model=[^\"]*)",
"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s")

STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';


REGEX : ([0-9]{1,}\.[0-9]{1,}\.[0-9]{1,}\.[0-9]{1,})(.*)(getstream.*)(appname=.*)(content_id=[0-9]{1,}.*)(eid=[0-9].*)(version=[(\d+\.?)]*)(.*uid=[0-9]{1,})(.*model=[^\"]*)

日志格式 - 两条有效记录。

123.236.122.18|"-"|-|2016-07-21T23:59:24+08:00|GET|http|isarrs.go.le.com|"/sarrs/apigetstream_json.so?sign=9fc79acfa5a5de4aa2819672247436da&appname=Levidi&content_id=6575672&appfrom=letv&lc=867466026357389&platform=1&user_setting_country=IN&clientos=6.0.1&sales_area=IN&eid=0&version=1.1.3&lang=en_GB&uid=3214761836&resolution=1080*1920&model=Le+X526"|HTTP/1.1|200|450|447|202|"-"|"Dalvik/2.1.0 (Linux; U; Android 6.0.1; Le X526 Build/IIXOSOP5801607082S)"|"10.121.152.15:8080"|"0.717"|0.717
103.14.185.15|"-"|-|2016-07-21T23:59:18+08:00|GET|http|isarrs.go.le.com|"/sarrs/apigetstream_json.so?sign=b097e1fe9b280e658c909886971ab818&appname=Levidi&content_id=6575672&appfrom=letv&lc=867466026096383&platform=1&user_setting_country=IN&clientos=6.0.1&sales_area=IN&eid=0&version=1.1.3&lang=en_GB&uid=1712386504&resolution=1080*1920&model=Le+X526"|HTTP/1.1|200|450|447|202|"-"|"Dalvik/2.1.0 (Linux; U; Android 6.0.1; Le X526 Build/IIXOSOP5801607082S)"|"10.121.152.30:8080"|"0.684"|0.684

问题是虽然我的正则表达式是正确的,在 rubular.com 上测试过,但我无法正确上传数据,因为配置单元没有正确地将多行日志处理为单个记录。我尝试了正则表达式和日志的一个子集来进行单次解析,效果很好。

我试过玩这个属性 textinputformat.record.delimiter

但它不起作用。请建议我一个正确的方法来覆盖 textinputformat.record.delimiter,以实现正确的解析。

最佳答案

在 Hive 中,无论您在正则表达式中使用 "\",都需要使用 "\\"

"input.regex" = "([0-9]{1,}\\.[0-9]{1,}\\.[0-9]{1,}\\.[0-9]{1,})(.*)(getstream.*)(appname=.*)(content_id=[0-9]{1,}.*)(eid=[0-9].*)(version=[(\\d+\\.?)]*)(.*uid=[0-9]{1,})(.*model=[^\\"]*)"

关于regex - 表格中的 HIVE 正则表达式记录定界符空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38634322/

相关文章:

java - Java 中的特殊正则表达式语法

hadoop - 为什么 Mutation 不为现有列插入

hadoop - 比较Pig中的变量

hadoop - 需要一种方法来过滤 HIVE 中某个 id 具有多个记录的记录的数据

sql - 最后位置的字符只能被替换 - Hive

regex - 什么正则表达式会捕获第二个 : mark to the end of a line? 中的所有内容

php - 匹配 {@layout=xxx} 的正则表达式

java - 如何用多个分隔符拆分字符串 - 并知道哪个分隔符匹配

hadoop - 在Pig Latin中无法使用FOREACH读取变体

hadoop - 从HDFS将Jar文件添加到Hive