2013-03-19 2 views
1

HDFS에 하이브 쿼리의 결과를 저장하려고했지만 데이터가 변경되었습니다. 어떤 생각?HDFS에 쓰기가 데이터를 엉망으로 만들었습니다.

아래의 데이터 및 변경된 사항을 참조하십시오. i.stack.imgur.com/ DLNTT.png

[[어질러] : i.stack.imgur.com/ 7WIO3.png 파일 이름 :

[[수정] 전에 공백을 제거

의견을 보내 주시면 감사하겠습니다. 사전에

감사합니다.

답변

0

complex types 중 하나 인 하이브에 배열을 가져 오는 것 같습니다. 내부적으로 하이브는 배열의 요소를 ASCII 문자 002로 분리합니다. ascii table을 참조하면 인쇄 할 수없는 문자 "텍스트 시작"임을 알 수 있습니다. 귀하의 터미널이 실제로 인쇄 할 수없는 문자를 인쇄하는 것처럼 보입니다. 두 이미지를 비교하면 002가 실제로 배열의 모든 항목을 분리한다는 것을 알 수 있습니다.

마찬가지로 하이브는 행의 모든 ​​열을 ASCII 001로 분리하며 맵 키/값과 구조 필드/값을 ASCII 003으로 구분합니다.이 값은 데이터에 표시되지 않기 때문에 선택되었습니다. 이 값을 변경하려면 구분 문자 using ROW FORMAT in you create table statement을 수동으로 지정할 수 있습니다. 그러나 수집 항목 종단자를 ,과 같은 것으로 바꾸면 입력 한 쉼표가 하이브의 콜렉션 종결 자처럼 보일 수 있습니다.

사람이 읽을 수있는 형식으로 데이터를 저장할 필요가없고 터미네이터와 충돌하지 않는 인쇄 가능한 문자가 있는지 확인하지 않는 한 그대로 두십시오. HDFS 파일을 읽어야 할 경우 배열 항목을 탭으로 구분하여 표시하려면 항상 hadoop fs -cat /exampleWarehouseDir/exampleTable/* | tr '\002' '\t'을 사용할 수 있습니다. Hive 테이블에 대해 MapReduce 또는 Pig 작업을 작성하는 경우 구분 기호가 무엇인지 알고 있어야합니다. 학습 방법 writeread MapReduce의 하이브 테이블은 이러한 터미네이터에 대해 처음 알게 된 방법입니다. 그리고 하이브에서 모든 처리를하고 있다면 입력 데이터에 나타나지 않는 한 터미네이터가 무엇인지 걱정할 필요가 없습니다.

이제는 HDFS에서 파일 내용을 읽는 중 ASCII 002가 표시되는 이유를 설명하지만 컬렉션 종료자를 인식해야하는 하이브 명령 줄 인터페이스에서 보는 것처럼 보입니다 따라서 인쇄 대신 배열 요소를 분리하는 데 사용하십시오. 내 생각 엔 거기에 잘못된 스키마를 지정했고 테이블의 열 results은 배열로 만들려는 문자열입니다. 이것은 앞으로 나아가 콜렉션 터미네이터로 사용하는 대신 ASCII 002를 인쇄 한 이유를 설명합니다.

관련 문제