복붙노트

[HADOOP] Hive INSERT OVERWRITE DIRECTORY 명령 출력이 분리 문자로 분리되지 않습니다. 왜?

HADOOP

Hive INSERT OVERWRITE DIRECTORY 명령 출력이 분리 문자로 분리되지 않습니다. 왜?

로드중인 파일은 ''(공백)로 구분됩니다. 아래 파일이 있습니다. 파일은 HDFS에 있습니다.

001 000
001 000
002 001
003 002
004 003
005 004
006 005
007 006
008 007
099 007

1> 아래 명령을 실행하여 외부 테이블을 생성하고 파일을로드합니다.

CREATE EXTERNAL TABLE IF NOT EXISTS graph_edges (src_node_id STRING COMMENT 'Node ID of Source node', dest_node_id STRING COMMENT 'Node ID of Destination node') ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' STORED AS TEXTFILE LOCATION '/user/hadoop/input';

2>이 후, 아래 명령을 실행하여 테이블을 다른 파일에 삽입하기 만하면됩니다.

INSERT OVERWRITE DIRECTORY '/user/hadoop/output' SELECT * FROM graph_edges;

3> 이제 파일을 열면 필드가 구분 기호로 구분되지 않습니다. -

hadoop dfs -cat /user/hadoop/output/000000_0

산출:-

001000
001000
002001
003002
004003
005004
006005
007006
008007
099007

누군가 나를 도울 수 있습니까? 분리 문자가 제거되고 출력 파일을 구분하는 이유는 무엇입니까?

CREATE TABLE 명령에서 DELIMITED BY '\ t'를 시도했지만 불필요한 NULL 컬럼을 얻고 있습니다.

모든 포인터 도움을 많이 도움이됩니다. 하이브 0.9.0 버전을 사용하고 있습니다.

해결법

  1. ==============================

    1.문제는 HIVE가 출력 구분 기호 - https://issues.apache.org/jira/browse/HIVE-634를 지정할 수 없다는 것입니다.

    문제는 HIVE가 출력 구분 기호 - https://issues.apache.org/jira/browse/HIVE-634를 지정할 수 없다는 것입니다.

    해결책은 출력용으로 외부 테이블을 작성하고 (분리 문자 스펙으로) 디렉토리 대신 겹쳐 쓰기 테이블을 삽입하는 것입니다.

    --

    HDFS에 /user/hadoop/input/graph_edges.csv가 있다고 가정하면,

    hive> create external table graph_edges (src string, dest string) 
        > row format delimited 
        > fields terminated by ' ' 
        > lines terminated by '\n' 
        > stored as textfile location '/user/hadoop/input';
    
    hive> select * from graph_edges;
    OK
    001 000
    001 000
    002 001
    003 002
    004 003
    005 004
    006 005
    007 006
    008 007
    099 007
    
    hive> create external table graph_out (src string, dest string) 
        > row format delimited 
        > fields terminated by ' ' 
        > lines terminated by '\n' 
        > stored as textfile location '/user/hadoop/output';
    
    hive> insert into table graph_out select * from graph_edges;
    hive> select * from graph_out;
    OK
    001 000
    001 000
    002 001
    003 002
    004 003
    005 004
    006 005
    007 006
    008 007
    099 007
    
    [user@box] hadoop fs -get /user/hadoop/output/000000_0 .
    

    위와 같이 공백이옵니다.

  2. ==============================

    2.concat_ws 함수를 사용하면 출력을 얻을 수 있다고 생각합니다.

    concat_ws 함수를 사용하면 출력을 얻을 수 있다고 생각합니다.

    여기 나는 쉼표를 열 구분자로 선택했다.

  3. ==============================

    3.질문이 2 세 이상이었고 그 당시의 최고 대답이 정확했지만 Hive가 구분 된 데이터를 디렉토리에 쓰도록 할 수 있습니다.

    질문이 2 세 이상이었고 그 당시의 최고 대답이 정확했지만 Hive가 구분 된 데이터를 디렉토리에 쓰도록 할 수 있습니다.

    다음은 전통적인 ^ A 분리 기호로 데이터를 출력하는 예입니다.

    INSERT OVERWRITE DIRECTORY '/output/data_delimited'
    SELECT *
    FROM data_schema.data_table
    

    이제 탭 구분 기호가 있습니다.

    INSERT OVERWRITE DIRECTORY '/output/data_delimited'
    row format delimited 
    FIELDS TERMINATED BY '\t'
    SELECT *
    FROM data_schema.data_table
    
  4. ==============================

    4.나는 다른 목소리를 가지고있다.

    나는 다른 목소리를 가지고있다.

    실제로 하이브는 사용자 지정 구분 기호를 지원하지 않습니다.

    그러나 INSERT OVERWRITE DIRECTORY를 사용할 때 줄에 구분 기호가 있습니다. 구분 기호는 '\ 1'입니다.

    hadoop dfs -cat $ file |을 사용할 수 있습니다. 머리 -1 | xxd를 사용하여 파일을 찾거나 HDFS에서 로컬 시스템으로 파일을 가져 와서 vim으로 엽니 다. 구분 기호 인 정력에 '^ A'와 같은 문자가 있습니다.

    위로 질문에, 당신은 그것을 해결하는 간단한 방법을 사용할 수 있습니다.

  5. ==============================

    5.디렉토리에 쓸 때 구분 기호를 제공 할 수 있습니다.

    디렉토리에 쓸 때 구분 기호를 제공 할 수 있습니다.

    INSERT OVERWRITE DIRECTORY '/user/hadoop/output'
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY
    SELECT * FROM graph_edges;
    

    이것은 당신을 위해 작동해야합니다.

  6. ==============================

    6.하이브 쿼리 결과의 출력이 파이프로 구분되어야하는이 문제가있었습니다. 이 sed 명령을 실행하면 다음을 대체 할 수 있습니다 : ^ A to |

    하이브 쿼리 결과의 출력이 파이프로 구분되어야하는이 문제가있었습니다. 이 sed 명령을 실행하면 다음을 대체 할 수 있습니다 : ^ A to |

    sed의 # \ x01 # | #g 'test.log> piped_test.log

  7. ==============================

    7.기본 구분 기호는 "^ A"입니다. 파이썬 언어에서는 "\ x01"입니다.

    기본 구분 기호는 "^ A"입니다. 파이썬 언어에서는 "\ x01"입니다.

    구분 기호를 변경하려면 다음과 같이 SQL을 사용합니다.

    SELECT col1, delimiter, col2, delimiter, col3, ..., FROM 표

    그런 다음 구분 기호 + "^ A"를 새로운 구분 기호로 간주하십시오.

  8. ==============================

    8.하이브가 실제로 컨트롤 -A를 구분 기호로 쓰고 있다고 의심하지만, 화면에 고양이를 쓰면 눈에 보이지 않습니다.

    하이브가 실제로 컨트롤 -A를 구분 기호로 쓰고 있다고 의심하지만, 화면에 고양이를 쓰면 눈에 보이지 않습니다.

    대신 파일을 vi로 가져 오거나 조금만보고 싶다면 파일을 검색해보십시오. vi 결과는 다음과 같습니다.

    hadoop dfs -cat / user / hadoop / output / 000000_0 | head> my_local_file.txt

    vi my_local_file.txt

    거기에 ^ A 문자를 볼 수 있어야합니다.

  9. ==============================

    9.이것은 내가 달성하는 방법에 대한 라운드이지만 가정하는 더 나은 솔루션이 될 것입니다.

    이것은 내가 달성하는 방법에 대한 라운드이지만 가정하는 더 나은 솔루션이 될 것입니다.

    OVERWRITE DIRECTORY '/ user / hadoop / output'을 삽입하십시오. SELECT src_node_id, '', dest_node_id FROM graph_edges;

  10. ==============================

    10.이 매개 변수를 사용할 수 있습니다 "행 형식으로 구분 된 필드는 '|'로 끝나야합니다. 예를 들어

    이 매개 변수를 사용할 수 있습니다 "행 형식으로 구분 된 필드는 '|'로 끝나야합니다. 예를 들어

    INSERT OVERWRITE DIRECTORY '/ user / hadoop / output'행 형식으로 구분 된 필드가 '|'로 끝납니다. SELECT * FROM graph_edges;

  11. from https://stackoverflow.com/questions/16459790/hive-insert-overwrite-directory-command-output-is-not-separated-by-a-delimiter by cc-by-sa and MIT license