由逗号和多个空格分隔的Hive表

时间:2017-07-27 08:33:53

标签: hadoop hive hive-serde

我有一个类似的问题: Hive table source delimited by multiple spaces

我的数据如下:

AL, 01, 2016010700,   , BEST,   0, 266N,  753W
AL, 01, 2016010706,   , BEST,   0, 276N,  747W
AL, 01, 2016010712,   , BEST,   0, 287N,  738W
AL, 01, 2016010712,   , BEST,   0, 287N,  738W

这意味着我的列分隔符为"逗号加上可变数量的空格"。

我尝试通过将此逗号添加到正则表达式来简单地修改field.delim,但它不起作用。 结果是,所有数据都放入第一列(basin),所有其他列都为NULL。

CREATE EXTERNAL TABLE IF NOT EXISTS default.myTable1
(
   basin string
  ,cy string
  ,yyyymmddhh int
  ,technum_min string
  ,tech string
  ,tau string
  ,lat_n_s string
  ,lon_e_w string 
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe' 
WITH SERDEPROPERTIES ("field.delim"=",\\s+")
LOCATION '/data';

我正在运行HDP 2.5(Hive 1.2.1)。

感谢您提供任何帮助和建议。

2 个答案:

答案 0 :(得分:1)

我们有两种方法来解决您的问题。 创建表' rawTbl'使用以下选项

ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

并使用trim()删除空格

Insert into baseTbl select trim(basin), trim(cy),...., from rawTbl

或者您可以使用regEx

我已经用正则表达式更新了答案,它将由请求字段组成的文本输入文件分开。正则表达式包含7个正则表达式组,用于捕获每行上的请求字段。

CREATE EXTERNAL TABlE tableex(basin string
  ,cy string
  ,yyyymmddhh int
  ,technum_min string
  ,tech string
  ,tau string
  ,lat_n_s string
  ,lon_e_w string ) 
ROW FORMAT 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  "input.regex" = '^([A-Za-z]{2}),\s+(\d{2}),\s(\d{10}),\s+,\s([A-Z]{4}),\s+(\d{1}),\s+(\d{3}[A-Z]{1}),\s+(\d+[A-Z]{1})'
)
LOCATION '/data';

答案 1 :(得分:0)

这个怎么样

(\S+),\s+(\S+),\s(\S+),\s+,\s(\S+)\s+(\S+),\s+(\S+),\s+(\S*)