我正在尝试从输入文件中将数据插入到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'
答案 0 :(得分:1)
A []表达式仅定义一类字符。如果未指定量词,则表示:确切地说,已定义类的一个字符出现一次。因此,你的表达可能看起来像这样:
(([^ ]*),(\"[^\"]*\"),(\"[^\"]*\"),([^ ]*),(\"[^\"]*\"),(\"[^\"]*\"))
答案 1 :(得分:0)
使用以下正则表达式应该符合条件的模式。
(([^ \"] +),(\" [^ \"] + \&#34),(\" [^ \&#34 ;] + \&#34),([^ \"] +),(\" [^ \"] + \&#34),(\" [^ \"] + \&#34))
或如上所述,根据语言要求(我不熟悉hive),您可能无需转义括号内的引号:
(([^"] +),(\" [^"] + \&#34),(\" [^"] + \&#34),([^"] +),(\" [^"] + \&#34),(\" [^&#34 ;] + \&#34))
使用+匹配至少存在,*不需要匹配。
答案 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"')]
>>>