Карта улья неправильно считывает входные данные

#hive #mahout

#улей #mahout

Вопрос:

Я пытаюсь создать таблицу для выходных данных этой рекомендательной системы mahout на s3.

 703209355938578 [18519:1.5216354,18468:1.5127649,17962:1.5094717,18317:1.5075916]
828667482548563 [18070:1.0,18641:1.0,18632:1.0,18770:1.0,17814:1.0,18095:1.0]
1705358040772485 [18783:1.0,17944:1.0,18632:1.0,18770:1.0,18914:1.0,18386:1.0]
  

с помощью этой схемы,

 CREATE external table user_ad_reco (
userid bigint,
reco MAP<bigint , double>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY 't'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
LOCATION
's3://xxxxx/data/RS/output/m05/';
  

но пока я считываю данные обратно с помощью улья,

улей>

 select * from user_ad_reco limit 10;
  

Он выдает вывод следующим образом

 703209355938578 {18519:1.5216354,18468:1.5127649,17962:null}
828667482548563 {18070:1.0,18641:1.0,18632:1.0,18770:1.0,17814:null}
1705358040772485 {18783:1.0,17944:1.0,18632:1.0,18770:1.0,18914:null}
  

Итак, последний ключ: значение ввода карты отсутствует в выводе с null в последней выходной паре:(.

Кто-нибудь может помочь в этом?

Ответ №1:

Причина для нулей :

  • формат входных данных в скобках дает значение null, причина в том, что формат строки в скобках неправильно считывается, последняя запись карты 1.5075916 считывается как 1.5075916], поэтому она выдает значение null из-за несоответствия типов данных.

703209355938578 [ 18519:1.5216354,18468:1.5127649,17962:1.5094717,18317:1.5075916 ]

  • формат входных данных без скобок работает чисто: (проверено)

703209355938578 18519:1.5216354,18468:1.5127649,17962:1.5094717,18317:1.5075916

Ответ №2:

Спасибо @ramisetty, я сделал это каким-то косвенным способом, сначала избавился от двух скобок [,] из строки карты, затем создал схему для строки без скобок.

 CREATE EXTERNAL TABLE  user_ad_reco_serde (
userid STRING,
reco_map STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES  (
"input.regex" = "([0-9] )\s\[([^]] )]"
)
STORED AS TEXTFILE
LOCATION
's3://xxxxxx/data/RS/output/6m/2014-01-2014-05/';  

CREATE external table user_ad_reco_plain(
userid bigint,
reco string)
LOCATION
's3://xxxxx/data/RS/output/6m_plain/2014-01-2014-05/';

CREATE external table user_ad_reco (
userid bigint,
reco MAP<bigint , double>)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '01'
COLLECTION ITEMS TERMINATED BY ','
MAP KEYS TERMINATED BY ':'
LOCATION
's3://xxxxxx/data/RS/output/6m_plain/2014-01-2014-05/';
  

Может быть какой-то более простой способ.