#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/';
Может быть какой-то более простой способ.