Таблица кустов, разделенная запятой и несколькими пробелами
У меня есть похожий вопрос здесь: источник таблицы 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*)