0

我有一个类似的问题: 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)。

感谢您的任何帮助和建议。

4

2 回答 2

2

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

ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

并使用 trim() 删除空间

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

或者你可以使用正则表达式

我已经用正则表达式更新了答案,它将由请求字段组成的文本输入文件分开。正则表达式包含 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';
于 2017-07-27T08:48:12.380 回答
0

这个怎么样

(\S+),\s+(\S+),\s(\S+),\s+,\s(\S+)\s+(\S+),\s+(\S+),\s+(\S*)
于 2017-09-25T17:02:26.243 回答