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 的字符恰好出现一次。因此,您的表达式大概必须如下所示:

(([^ ]*),(\"[^\"]*\"),(\"[^\"]*\"),([^ ]*),(\"[^\"]*\"),(\"[^\"]*\"))

使用以下正则表达式应该符合给定条件的模式。

(([^\"]+),(\"[^\"]+\"),(\"[^\"]+\"),([^\"]+), (\"[^\"]+\"),(\"[^\"]+\"))

或如前所述,根据语言要求(我对配置单元不熟悉),您可能不需要转义括号内的引号:

(([^"]+),(\"[^"]+\"),(\"[^"]+\"),([^"]+),(\"[ ^"]+\"),(\"[^"]+\"))

使用 + 至少匹配存在,* 不需要匹配。

http://regexr.com/3be3i

根据使用此正则表达式的位置,可能不需要反斜杠。 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"')]
>>>