Преобразование строки в таблице Hive в структуру массива - PullRequest
1 голос
/ 04 мая 2020

У меня есть исходный файл, который нужно загрузить в таблицу Hive. Два поля - это массивы часов хранения, и как бы я ни старался, я не могу загрузить их как структуры массива.

Исходный файл:

1ab345c5f964a520da6z20e3|This Store Name|[{day:1,starttime:330,endtime:1260},{day:2,starttime:330,endtime:1260},{day:3,starttime:330,endtime:1260},{day:4,starttime:330,endtime:1260},{day:5,starttime:330,endtime:1260},{day:6,starttime:330,endtime:1260},{day:7,starttime:330,endtime:1260}]|[{startdate:{month:3,day:27},enddate:{month:3,day:27},weeklyhours:[{day:5,starttime:0,endtime:1440}],closed:true},{startdate:{month:3,day:28},enddate:{month:3,day:28},weeklyhours:[{day:6,starttime:0,endtime:1440}],closed:true},{startdate:{month:3,day:29},enddate:{month:3,day:29},weeklyhours:[{day:7,starttime:0,endtime:1440}],closed:true},{startdate:{month:3,day:30},enddate:{month:3,day:30},weeklyhours:[{day:1,starttime:0,endtime:1440}],closed:true},{startdate:{month:3,day:31},enddate:{month:3,day:31},weeklyhours:[{day:2,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:1},enddate:{month:4,day:1},weeklyhours:[{day:3,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:2},enddate:{month:4,day:2},weeklyhours:[{day:4,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:3},enddate:{month:4,day:3},weeklyhours:[{day:5,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:4},enddate:{month:4,day:4},weeklyhours:[{day:6,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:5},enddate:{month:4,day:5},weeklyhours:[{day:7,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:6},enddate:{month:4,day:6},weeklyhours:[{day:1,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:7},enddate:{month:4,day:7},weeklyhours:[{day:2,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:8},enddate:{month:4,day:8},weeklyhours:[{day:3,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:9},enddate:{month:4,day:9},weeklyhours:[{day:4,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:10},enddate:{month:4,day:10},weeklyhours:[{day:5,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:11},enddate:{month:4,day:11},weeklyhours:[{day:6,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:12},enddate:{month:4,day:12},weeklyhours:[{day:7,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:13},enddate:{month:4,day:13},weeklyhours:[{day:1,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:14},enddate:{month:4,day:14},weeklyhours:[{day:2,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:15},enddate:{month:4,day:15},weeklyhours:[{day:3,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:16},enddate:{month:4,day:16},weeklyhours:[{day:4,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:17},enddate:{month:4,day:17},weeklyhours:[{day:5,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:18},enddate:{month:4,day:18},weeklyhours:[{day:6,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:19},enddate:{month:4,day:19},weeklyhours:[{day:7,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:20},enddate:{month:4,day:20},weeklyhours:[{day:1,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:21},enddate:{month:4,day:21},weeklyhours:[{day:2,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:22},enddate:{month:4,day:22},weeklyhours:[{day:3,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:23},enddate:{month:4,day:23},weeklyhours:[{day:4,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:24},enddate:{month:4,day:24},weeklyhours:[{day:5,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:25},enddate:{month:4,day:25},weeklyhours:[{day:6,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:26},enddate:{month:4,day:26},weeklyhours:[{day:7,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:27},enddate:{month:4,day:27},weeklyhours:[{day:1,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:28},enddate:{month:4,day:28},weeklyhours:[{day:2,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:29},enddate:{month:4,day:29},weeklyhours:[{day:3,starttime:0,endtime:1440}],closed:true},{startdate:{month:4,day:30},enddate:{month:4,day:30},weeklyhours:[{day:4,starttime:0,endtime:1440}],closed:true}]

Вот одна из вещей, которые я пробовал.

create external table store_hours (venueid string, venuename string, 
hours array<struct<day:int,starttime:int,endtime:int>>, 
seasonal_hours array<struct<startdate:struct<month:int,day:int,year:int>,enddate:struct<month:int,day:int,year:int>,weeklyhours:array<struct<day:int,starttime:int,endtime:int,label:string>>,closed:boolean>>
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '|'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
STORED AS TEXTFILE LOCATION '/path/to/data';

выбрать * из store_hours; Возвращает:

1ab345c5f964a520da6z20e3    This Store Name [{"day":null,"starttime":1,"endtime":null},{"day":null,"starttime":330,"endtime":null},{"day":null,"starttime":null,"endtime":null},{"day":null,"starttime":2,"endtime":null},{"day":null,"starttime":330,"endtime":null},{"day":null,"starttime":null,"endtime":null},{"day":null,"starttime":3,"endtime":null},{"day":null,"starttime":330,"endtime":null},{"day":null,"starttime":null,"endtime":null},{"day":null,"starttime":4,"endtime":null},{"day":null,"starttime":330,"endtime":null},{"day":null,"starttime":null,"endtime":null},{"day":null,"starttime":5,"endtime":null},{"day":null,"starttime":330,"endtime":null},{"day":null,"starttime":null,"endtime":null},{"day":null,"starttime":6,"endtime":null},{"day":null,"starttime":330,"endtime":null},{"day":null,"starttime":null,"endtime":null},{"day":null,"starttime":7,"endtime":null},{"day":null,"starttime":330,"endtime":null},{"day":null,"starttime":null,"endtime":null}]

Для "часов" данные в основном нулевые, но некоторые данные фактически считываются и присваиваются значениям, но назначения явно неверны.

Первое значение массива для поля часов: «[{день: 1, время начала: 330, время окончания: 1260}, ...». Похоже, что «1» от «день» назначается "starttime". Затем "330" от времени начала назначается времени начала, но во втором массиве, а не в первом. И время конца никогда не может быть назначено нигде.

Вывод поля «Season_hours» аналогичен, где большинство из них равны нулю с некоторыми значениями, заполненными в разных / неправильных позициях.

Я не могу понять, как это на самом деле выполняется и загружается, и я Я явно чего-то упускаю. Я ценю любую помощь.

...