Hive:这个正则表达式有什么问题?
Hive: What is wrong with this regex?
我正在尝试将数据从输入文件插入配置单元 table,该输入文件是格式如下的 csv:-
stringA,"stringB","stringC",stringD,"stringE","stringF"
其中 stringF 本身有分隔符“,”。
我尝试使用以下输入正则表达式,但我在 table 中得到所有 NULL 值:-
create external table tablName(col1 string, col2 string, col3 string, col4 string, col5 string, col6 string)
row format serde 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES
("input.regex" = (([^ ]*),(\"[^\"]\"),(\"[^\"]\"),([^ ]*),(\"[^\"]\"),(\"[^\"]\"))
Location '/path/to/data'
一个[ ]表达式只定义了class个字符。如果不指定量词,则表示:定义的 class 的字符恰好出现一次。因此,您的表达式大概必须如下所示:
(([^ ]*),(\"[^\"]*\"),(\"[^\"]*\"),([^ ]*),(\"[^\"]*\"),(\"[^\"]*\"))
使用以下正则表达式应该符合给定条件的模式。
(([^\"]+),(\"[^\"]+\"),(\"[^\"]+\"),([^\"]+), (\"[^\"]+\"),(\"[^\"]+\"))
或如前所述,根据语言要求(我对配置单元不熟悉),您可能不需要转义括号内的引号:
(([^"]+),(\"[^"]+\"),(\"[^"]+\"),([^"]+),(\"[ ^"]+\"),(\"[^"]+\"))
使用 + 至少匹配存在,* 不需要匹配。
根据使用此正则表达式的位置,可能不需要反斜杠。 Hive 可能需要它们,python 不需要。
最外面的大括号充当另一个捕获组,并导致再次匹配整个字符串。
>>> input = 'stringA,"stringB","stringC",stringD,"stringE","stringF"'
>>> print (input)
stringA,"stringB","stringC",stringD,"stringE","stringF"
>>> p = re.compile( '(([^"]+),(\"[^"]+"),(\"[^"]+"),([^"]+),(\"[^\"]+"),(\"[^"]+"))' )
>>> p.findall(input)
[('stringA,"stringB","stringC",stringD,"stringE","stringF"', 'stringA', '"stringB"', '"stringC"', 'stringD', '"stringE"', '"stringF"')]
>>> p = re.compile( '([^"]+),("[^"]+"),("[^"]+"),([^"]+),("[^"]+"),("[^"]+")' )
>>> p.findall(input)
[('stringA', '"stringB"', '"stringC"', 'stringD', '"stringE"', '"stringF"')]
>>>
我正在尝试将数据从输入文件插入配置单元 table,该输入文件是格式如下的 csv:-
stringA,"stringB","stringC",stringD,"stringE","stringF"
其中 stringF 本身有分隔符“,”。
我尝试使用以下输入正则表达式,但我在 table 中得到所有 NULL 值:-
create external table tablName(col1 string, col2 string, col3 string, col4 string, col5 string, col6 string)
row format serde 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES
("input.regex" = (([^ ]*),(\"[^\"]\"),(\"[^\"]\"),([^ ]*),(\"[^\"]\"),(\"[^\"]\"))
Location '/path/to/data'
一个[ ]表达式只定义了class个字符。如果不指定量词,则表示:定义的 class 的字符恰好出现一次。因此,您的表达式大概必须如下所示:
(([^ ]*),(\"[^\"]*\"),(\"[^\"]*\"),([^ ]*),(\"[^\"]*\"),(\"[^\"]*\"))
使用以下正则表达式应该符合给定条件的模式。
(([^\"]+),(\"[^\"]+\"),(\"[^\"]+\"),([^\"]+), (\"[^\"]+\"),(\"[^\"]+\"))
或如前所述,根据语言要求(我对配置单元不熟悉),您可能不需要转义括号内的引号:
(([^"]+),(\"[^"]+\"),(\"[^"]+\"),([^"]+),(\"[ ^"]+\"),(\"[^"]+\"))
使用 + 至少匹配存在,* 不需要匹配。
根据使用此正则表达式的位置,可能不需要反斜杠。 Hive 可能需要它们,python 不需要。 最外面的大括号充当另一个捕获组,并导致再次匹配整个字符串。
>>> input = 'stringA,"stringB","stringC",stringD,"stringE","stringF"'
>>> print (input)
stringA,"stringB","stringC",stringD,"stringE","stringF"
>>> p = re.compile( '(([^"]+),(\"[^"]+"),(\"[^"]+"),([^"]+),(\"[^\"]+"),(\"[^"]+"))' )
>>> p.findall(input)
[('stringA,"stringB","stringC",stringD,"stringE","stringF"', 'stringA', '"stringB"', '"stringC"', 'stringD', '"stringE"', '"stringF"')]
>>> p = re.compile( '([^"]+),("[^"]+"),("[^"]+"),([^"]+),("[^"]+"),("[^"]+")' )
>>> p.findall(input)
[('stringA', '"stringB"', '"stringC"', 'stringD', '"stringE"', '"stringF"')]
>>>