복붙노트

[HADOOP] 하이브는 쉼표로 인용 된 필드에 CSV를로드합니다.

HADOOP

하이브는 쉼표로 인용 된 필드에 CSV를로드합니다.

하이브 테이블에 CSV 파일을로드하려고합니다.

CREATE TABLE mytable
(
num1 INT,
text1 STRING,
num2 INT,
text2 STRING
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ",";

LOAD DATA LOCAL INPATH '/data.csv'
OVERWRITE INTO TABLE mytable;    

csv는 쉼표 (,)로 구분되며 다음과 같습니다.

1, "some text, with comma in it", 123, "more text"

첫 번째 문자열에 ','가 있기 때문에 손상된 데이터를 반환합니다. 텍스트 구분 기호를 설정하거나 Hive가 문자열에서 ','를 무시하도록 만드는 방법이 있습니까?

CSV의 구분 기호는 외부 소스에서 가져온 이후 변경할 수 없습니다.

해결법

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

    1.문제는 Hive가 인용 된 텍스트를 처리하지 않는다는 것입니다. 입력란 사이의 구분자 (예 : Hadoop 스트리밍 작업)를 변경하여 데이터를 사전 처리해야하거나 OpenCSV를 사용하여 파일을 구문 분석하는 맞춤 CSV SerDe를 사용할 수도 있습니다.

    문제는 Hive가 인용 된 텍스트를 처리하지 않는다는 것입니다. 입력란 사이의 구분자 (예 : Hadoop 스트리밍 작업)를 변경하여 데이터를 사전 처리해야하거나 OpenCSV를 사용하여 파일을 구문 분석하는 맞춤 CSV SerDe를 사용할 수도 있습니다.

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

    2.입력 데이터를 다시 만들거나 구문 분석 할 수있는 경우 CREATE TABLE에 이스케이프 문자를 지정할 수 있습니다.

    입력 데이터를 다시 만들거나 구문 분석 할 수있는 경우 CREATE TABLE에 이스케이프 문자를 지정할 수 있습니다.

    ROW FORMAT DELIMITED FIELDS TERMINATED BY "," ESCAPED BY '\\';
    

    이 줄을 4 개 필드로 받아들입니다.

    1,some text\, with comma in it,123,more text
    
  3. ==============================

    3.Hive 0.14에서 CSV SerDe는 Hive 설치의 표준 부분입니다.

    Hive 0.14에서 CSV SerDe는 Hive 설치의 표준 부분입니다.

    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'

    (참조 : https://cwiki.apache.org/confluence/display/Hive/CSV+Serde)

  4. ==============================

    4.구분 기호를 작은 따옴표로 묶어두면 작동합니다.

    구분 기호를 작은 따옴표로 묶어두면 작동합니다.

    ROW FORMAT DELIMITED 
    FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\n';
    

    이것은 효과가있다.

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

    5.FIELDS TERMINATED BY '백 슬래시를'\; '에 추가하십시오.

    FIELDS TERMINATED BY '백 슬래시를'\; '에 추가하십시오.

    예 :

    CREATE  TABLE demo_table_1_csv
    COMMENT 'my_csv_table 1'
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY '\;'
    LINES TERMINATED BY '\n'
    STORED AS TEXTFILE
    LOCATION 'your_hdfs_path'
    AS 
    select a.tran_uuid,a.cust_id,a.risk_flag,a.lookback_start_date,a.lookback_end_date,b.scn_name,b.alerted_risk_category,
    CASE WHEN (b.activity_id is not null ) THEN 1 ELSE 0 END as Alert_Flag 
    FROM scn1_rcc1_agg as a LEFT OUTER JOIN scenario_activity_alert as b ON a.tran_uuid = b.activity_id;
    

    나는 그것을 시험했으며, 효과가 있었다.

  6. from https://stackoverflow.com/questions/13628658/hive-load-csv-with-commas-in-quoted-fields by cc-by-sa and MIT license