Hive:这个正则表达式出了什么问题?

时间:2015-07-21 04:08:52

标签: regex hive

我正在尝试从输入文件中将数据插入到hive表中,该文件的格式如下: -

stringA,"stringB","stringC",stringD,"stringE","stringF"

其中stringF具有分隔符','本身。

我尝试使用以下输入正则表达式,但我在表中得到所有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'

3 个答案:

答案 0 :(得分:1)

A []表达式仅定义一类字符。如果未指定量词,则表示:确切地说,已定义类的一个字符出现一次。因此,你的表达可能看起来像这样:

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

答案 1 :(得分:0)

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

(([^ \"] +),(\" [^ \"] + \&#34),(\" [^ \&#34 ;] + \&#34),([^ \"] +),(\" [^ \"] + \&#34),(\" [^ \"] + \&#34))

或如上所述,根据语言要求(我不熟悉hive),您可能无需转义括号内的引号:

(([^"] +),(\" [^"] + \&#34),(\" [^"] + \&#34),([^"] +),(\" [^"] + \&#34),(\" [^&#34 ;] + \&#34))

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

http://regexr.com/3be3i

答案 2 :(得分:0)

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