Таблица кустов, разделенная запятой и несколькими пробелами

У меня есть похожий вопрос здесь: источник таблицы Hive, разделенный несколькими пробелами

Мои данные выглядят так:

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 ответа

У нас есть два подхода к решению вашей проблемы. создать таблицу 'rawTbl', используя опцию ниже

ROW FORMAT DELIMITED FIELDS TERMINATED BY ','

и используйте trim() для удаления пробела

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

ИЛИ вы можете использовать RegEx

Я обновил ответ с помощью регулярного выражения, который представляет собой отдельный текстовый файл ввода, состоящий из запрошенных полей. 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';

Как насчет этого

(\S+),\s+(\S+),\s(\S+),\s+,\s(\S+)\s+(\S+),\s+(\S+),\s+(\S*)
Другие вопросы по тегам