하이브에서 텍스트 파일을 가져오는 데 발생하는 구덩이를 해결합니다

5021 단어 hive가져오기text
오늘 한 학생을 도와 excel 데이터를 가져왔습니다. 저는 excel을 txt 형식으로 저장한 다음에 표를 만들어서 가져왔습니다. 실패!구분자 형식이 일치하지 않아 가져올 수 없습니다!!!어떻게 보면 양쪽이 모두\t인데 왜 일치하지 않습니까?
프로그래머로서 가장 두려워하지 않는 것은 실패이다. 왜냐하면 우리는 용감한 마음을 가지고 있기 때문이다.다시!또 실패야...
오랫동안 생각하고 내 시계 격식을 보니 나는 매우 저급한 실수를 저질렀다.
Hive 테이블의 저장 형식은orcfile!!!
모두가 알다시피orcfile는 압축 형식으로 대량의 저장 공간을 절약할 수 있지만 orc는 직접load 데이터를 할 수 없다는 특징이 있습니다!load 데이터를 만들려면textfile로 저장된 중간표를 만들고 데이터를 추출해야 합니다.이 잘못은 너무 간단하기 때문에 인터넷에 관련 과학 보급이 있기 때문에 그것을 잘못으로 쓰는 경우는 드물다.문제가 생긴 친구들은 길을 좀 돌아야 할 것 같으니 제가 실수를 메울게요~~~~

밤을 들다.


1. 우선, excel 표를 txt 형식으로 내보냅니다. (이 과정은 더 이상 군더더기 없이 인터넷 강좌가 많습니다.)

123, ,666,1990-09-23 12:00:18
256, ,555,1989-10-06 03:57:32
142, ,444,1992-07-04 05:05:45
2. 하이브에서 테이블 모델을 생성합니다.

CREATE TABLE IF NOT EXISTS STUDENTS
(
ID INT COMMENT' ',
SNAME STRING COMMENT ' ',
SCORE INT COMMENT ' ',
STIME STRING COMMENT ' '
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS ORCFILE;
3. 임시 테이블(중간 테이블)을 만듭니다.

CREATE TABLE IF NOT EXISTS STUDENTS_TMP
(
ID INT COMMENT' ',
SNAME STRING COMMENT ' ',
SCORE INT COMMENT ' ',
STIME STRING COMMENT ' '
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE;
대상 테이블의 이름과 저장 형식만 다른 것과 같습니다.
4. 임시 테이블에 데이터를 로드합니다.

load data local inpath '/export/data/1.txt' into table students_tmp;
5. 대상 테이블로 데이터 가져오기

insert overwrite table students select * from students_tmp;
6. 그리고 테이블 데이터를 보면 다음과 같은 효과가 있습니다.

hive > select * from students;
OK
123   666 1990-09-23 12:00:18
256   555 1989-10-06 03:57:32
142   444 1992-07-04 05:05:45
Time taken: 0.26 seconds, Fetched: 3 row(s)
다른 저장 형식인 SEQUENCEFILE, PARQUET 등도 textfile 형식으로 저장한 다음 목록을 뽑아야 한다.
내보내기 형식의 구분 부호표에 따라야 합니다. 그렇지 않으면load 데이터가 틀리거나 모두null입니다.
excel 내보내기 형식:

     
text \t   
csv ,  
7. 우리가 excel에서 내보낸 파일 형식이gb2312 (txt든 csv든 모두 이 형식이므로 디코딩이 필요합니다.) 이것을utf-8로 돌려야 로드할 수 있습니다.

그래서 로드하기 전에 우리는 일반적으로 두 가지 방법을 채택한다.


1. 텍스트 편집기에서 코드를 바꾸고bom을 가지고 있든 안 가지고 있든 상관없다. 그리고 업로드한다.
2. 파일이 있는 로컬 디렉토리에서 다음 명령 디코딩을 수행합니다.

piconv -f gb2312 -t UTF-8 1.txt > 2.txt
로컬 디렉터리에서 디코딩을 명령하면 파일 이름이 바뀝니다. 이 명령은 다른 파일에 파일을 쓰고 원본 파일의 내용을 비우므로 이름을 바꾸지 않으면 파일 내용이 완전히 손실됩니다.그래서 저희가 로드할 때 수정된 파일 이름을 꼭 선택해야 합니다.
예:
코드 이전 데이터:

hive> select * from students;
OK
112	��	35	2017/8/19 15:30
113	����	45	
114	³��	55	2017/8/21 15:30
115	����	NULL	
116	������	75	2017/8/23 15:30
117	������	85	2017/8/24 15:30
118	�˽�	NULL	2017/8/25 15:30
119	������	90	
120	СѾ	NULL	2017/8/27 15:30
121	����	80	2017/8/28 15:30
122	��߸	75	
123	��«��	70	2017/8/30 15:30
124	����	NULL	2017/8/31 15:30
125	�F	NULL	
126	� 	NULL	2017/9/2 15:30
127	˾��	50	2017/9/3 15:30
128	������	58	2017/9/4 15:30
129	����	66	2017/9/5 15:30
Time taken: 0.134 seconds, Fetched: 18 row(s)
디렉터리에 가서 코드를 바꾸고 Load

piconv -f gb2312 -t UTF-8 2.csv > 3.csv
#  hive Load:
hive> load data local inpath '/export/data/3.csv' into table students;
결과:

hive> select * from students;
OK
112	 	35	2017/8/19 15:30
113	 	45	
114	 	55	2017/8/21 15:30
115	 	NULL	
116	 	75	2017/8/23 15:30
117	 	85	2017/8/24 15:30
118	 	NULL	2017/8/25 15:30
119	 	90	
120	 	NULL	2017/8/27 15:30
121	 	80	2017/8/28 15:30
122	 	75	
123	 	70	2017/8/30 15:30
124	 	NULL	2017/8/31 15:30
125	 	NULL	
126	 	NULL	2017/9/2 15:30
127	 	50	2017/9/3 15:30
128	 	58	2017/9/4 15:30
129	 	66	2017/9/5 15:30
Time taken: 0.106 seconds, Fetched: 18 row(s)
보충: Hive 가져오기 데이터 NULL
hdfs에서 데이터를hive의 테이블로 옮길 때 데이터 비트 NULL이 나타나면 열 구분자가 지정되지 않기 때문입니다.
하이브의 기본 구분자는/u0001(Ctrl+A)이기 때문에 부드럽게 이동하기 위해서는 표를 만들 때 데이터의 분할 기호를 지정해야 합니다. 문법은 다음과 같습니다.

hive (default)> create external table et (time BIGINT, userid string, content string, urlrank int, urlnum int, url string)
  > partitioned by (filenum int) 
  > row format delimited fields terminated by '\t'; 
위에서 만든 것은 외부 테이블입니다. 데이터를 가져올 때load를 사용할 수 있지만, 데이터를 이동하지 않으려면 명령alter로 가리킵니다.

alter table et add partition (filenum=1) location '/input/SogouQueryLog/file1';
location 뒤에 있는 주소는 디렉터리여야 합니다. 그렇지 않으면 hdfs fs-mv src dest로 데이터를 이동할 수 있습니다.

hadoop fs -mv /input/SogouQueryLog/querylog_1 /input/SogouQueryLog/file1
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.

좋은 웹페이지 즐겨찾기