2014-02-07 2 views
1

하이브 형식으로 저장된 HDFS에서 처리 된 데이터를 Sqoop을 사용하여 MySQL 서버로 내보내고 있습니다. 이 코드는 간단하고 간단하지만, 내가하는 일과 상관없이 Sqoop은 필드 구분 기호를 올바르게 인식하지 못합니다. 무엇이 문제가 될 수 있습니까? 내가 HDFS에서 파일을 검사 할 때Sqoop을 사용하여 하이브에서 MySQL로 데이터를 내보낼 수 없습니다

이 필드를 올바르게 \t (탭) 문자를 사용하여 구분되며,

hive> show create table database.weblog_ag; 

OK 
CREATE TABLE database.weblog_ag(
    visitor_id string, 
    time array<string>, 
    url array<string>, 
    client_time array<string>, 
    resolution array<string>, 
    browser array<string>, 
    os array<string>, 
    devicetype array<string>, 
    devicemodel array<string>, 
    ipinfo array<string> 
CLUSTERED BY (
    visitor_id) 
SORTED BY (
    time ASC) 
INTO 32 BUCKETS 
ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY '\t' 
STORED AS INPUTFORMAT 
    'org.apache.hadoop.mapred.TextInputFormat' 
OUTPUTFORMAT 
    'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' 
LOCATION 
    'hdfs://poc/apps/hive/warehouse/database.db/weblog_ag' 
TBLPROPERTIES (
    'numPartitions'='0', 
    'numFiles'='96', 
    'transient_lastDdlTime'='1390411893', 
    'totalSize'='59633487', 
    'numRows'='0', 
    'rawDataSize'='0') 
Time taken: 1.871 seconds, Fetched: 31 row(s) 

하이브

내 테이블 정의입니다. 이것은이 내 Sqoop을 옵션 파일 구성

export 

--connect 
jdbc:mysql://webserver/fprofile_db 

--username 
username 

--password 
password 

--table 
weblog 

--direct 

--export-dir 
/apps/hive/warehouse/database.db/weblog_ag 

--input-fields-terminated-by 
'\011' 

--columns 
visitor_id, time, url, client_time, resolution, browser, os, devicetype, devicemodel, ipinfo 

나는 --input-fields-terminated-by 매개 변수에 '\011, \t을 사용하려고하지만, 그들 중 누구도 작동하지 않을 것입니다 내가 HDFS

101009a36b3113fa  2014-01-06 08:59:58  http://someurl 2014-01-06 08:56:53  1280x800  Chrome Windows XP  General_Desktop Other 115.74.215.116 

에서 잡고 샘플 데이터입니다. mySQL에서 내 보낸 결과는 다음과 같습니다.

enter image description here 여기에서 문제가 될 수있는 것은 무엇입니까? 당신이 수출 비록

답변

3

를 사용할 필요가 문제의 원인은 --direct 옵션입니다. 나는 그것을 제거하고 모든 것이 잘 작동한다.

0

, 당신은 실제로 그래서 하루의 끝에

--fields-terminated-by 
'\t' 
0

mysql 다이렉트 모드로 SQOOP가 내 --input-fields-terminated-by을 무시하고 항상 0x2c (쉼표)를 사용하고있는 것을 발견했습니다. 당신이 종료 필드에 지정 볼 수 있습니다

LOAD DATA LOCAL INFILE '/yarn/nm/usercache/hdfs/appcache/application_12345/somefile.txt' 
    INTO TABLE mytable 
FIELDS TERMINATED BY 0x2c 
LINES TERMINATED BY 0xa 
IGNORE 0 LINES (field1, field2, ...) 

:

내가 MySQL 용 Sqoop을 직접 모드를 사용

, 그것은 같은 쿼리를 생성합니다.

관련 문제