配置单元:使用带有多个选项卡的RegexSerDe

配置单元:使用带有多个选项卡的RegexSerDe,regex,hadoop,hive,Regex,Hadoop,Hive,我需要将txt表加载到配置单元。Txt表格包含表格中以制表符分隔的列。问题是,有多个选项卡分隔的列: 135.124.143.193 20150601013300 http://newsru.com/4712386 253 486 ok 第一列和第二列之间有三个选项卡,其余列之间正好有一个选项卡 我发现我需要使用RegexSerDe来正确处理它。 我正在努力 row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe' wi

我需要将txt表加载到配置单元。Txt表格包含表格中以制表符分隔的列。问题是,有多个选项卡分隔的列:

135.124.143.193   20150601013300 http://newsru.com/4712386 253 486 ok
第一列和第二列之间有三个选项卡,其余列之间正好有一个选项卡

我发现我需要使用RegexSerDe来正确处理它。 我正在努力

row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
    with serdeproperties ("input.regex" = "(\\S+)\\t+")
但当我尝试从结果表中选择时,我得到:

Failed with exception java.io.IOException:org.apache.hadoop.hive.serde2.SerDeException: Number of matching groups doesn't match the number of columns

如果字符串末尾没有tab,您将无法匹配最后一个值,这将只获得第一个捕获组

您可能要做的是匹配由1+个选项卡分隔的所有组数

根据评论,这种模式适合您

(\\S+)\\t+(\\S+)\\t(\\S+)\\t(\\S+)\\t(\\S+)\\t(\\S+).*
如果您希望在第一个组后正好匹配3个选项卡,可以使用量词\\t{3}而不是\\t+

如果要精确匹配所有列,还可以使用锚点来断言字符串的start^和end$

^(\\S+)\\t+(\\S+)\\t+(\\S+)\\t+(\\S+)\\t+(\\S+)\\t+(\\S+)$

使用一个交替断言字符串的结尾,像这样尝试。如果末尾没有制表符,则与最后一个值不匹配\S+?:\t+|$尝试将此作为输入。regex=\\S+?:\\t+|$参数,但仍然得到相同的结果error@EgorMaksimov如果你使用准确的捕获组数^\\S+\\t+\\S+\\t+\\S+\\t+\\S+\\t+\\S+\\t+\\S+$See\\S+\\t+\\S+\\t\\S+\\t\\S+\\t\\S+\\t\\S+\\t+\\S+.*成功。谢谢你的帮助@EgorMaksimov很好用:我已经用这个模式更新了答案。