복붙노트

[HADOOP] 빈 문자열과 중복 된 CSV 파일을 DynamoDB로 가져 오기

HADOOP

빈 문자열과 중복 된 CSV 파일을 DynamoDB로 가져 오기

Amazon DynamoDB로 가져 오려는 CSV 파일이 있습니다. 따라서 S3에 업로드하고 EMR 클러스터를 설정하고 다음과 같은 외부 테이블을 만듭니다.

hive> CREATE EXTERNAL TABLE s3_table_myitems (colA BIGINT, colB STRING, colC STRING, colD DOUBLE, colE DOUBLE, colF STRING, colG STRING)
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    WITH SERDEPROPERTIES ('serialization.null.format'='""')
    STORED AS TEXTFILE
    LOCATION 's3://bucketname/dirname/'
    TBLPROPERTIES ('skip.header.line.count'='1');

CSV의 모든 열이 비어있을 수 있지만 DynamoDB는 빈 문자열을 처리 할 수 ​​없습니다 ( "com.amazonaws.AmazonServiceException : 하나 이상의 매개 변수 값이 잘못되었습니다 : AttributeValue에 빈 문자열이 포함되어 있지 않을 수 있습니다").

이것이 아마존의 말입니다.

그래서 이것은 내가 생각해 냈지만 추악한 것처럼 보입니다.

hive> INSERT INTO TABLE ddb_tbl_ingredients
    SELECT
    regexp_replace(colA, '^$', 'NULL'),
    regexp_replace(colB, '^$', 'NULL'),
    regexp_replace(colC, '^$', 'NULL'),
    regexp_replace(colD, '^$', 'NULL'),
    regexp_replace(colE, '^$', 'NULL'),
    regexp_replace(colF, '^$', 'NULL'),
    regexp_replace(colG, '^$', 'NULL')
    FROM s3_table_ingredients;

전반적인 문제에 대한 더 나은 해결책이 있습니까 (CSV 전처리 부족) 또는 더 나은 SELECT 구문이 있습니까?

편집 : 중복을 처리해야했습니다 ( "com.amazonaws.AmazonServiceException : 제공된 항목 키 목록에 중복이 포함되어 있습니다").

후손을 위해 여기에 완전한 흐름이 있습니다. 나는 미학과 공연 모두를 위해 더 좋은 방법을 듣고 싶습니다. 이 작업은 간단 해 보이지만 ( "CSV 파일을 DynamoDB로 가져 오기")이 작업은 지금까지 몇 시간이 걸렸습니다 .P

# source
hive> CREATE EXTERNAL TABLE s3_table_myitems (colA STRING, colB STRING, colC DOUBLE, colD DOUBLE, colE STRING, colF STRING)
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    WITH SERDEPROPERTIES ('serialization.null.format'='""')
    STORED AS TEXTFILE
    LOCATION 's3://bucketname/dirname/'
    TBLPROPERTIES ('skip.header.line.count'='1');

# destination
hive> CREATE EXTERNAL TABLE ddb_tbl_myitems (colA STRING, colB STRING, colC DOUBLE, colD DOUBLE, colE STRING, colF STRING)
    STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
    TBLPROPERTIES ("dynamodb.table.name" = "myitems",
        "dynamodb.column.mapping" = "colA:colA,colB:colB,colC:colC,colD:colD,colE:colE,colF:colF");

# remove dupes - http://stackoverflow.com/a/34165762/594211
hive> CREATE TABLE tbl_myitems_deduped AS
    SELECT colA, min(colB) AS colB, min(colC) AS colC, min(colD) AS colD, min(colE) AS colE, min(colF) AS colF
    FROM (SELECT colA, colB, colC, colD, unit, colF, rank() OVER
        (PARTITION BY colA ORDER BY colB, colC, colD, colE, colF)
        AS col_rank FROM s3_table_myitems) t
    WHERE t.col_rank = 1
    GROUP BY colA;

# replace empty strings with placeholder 'NULL'
hive> CREATE TABLE tbl_myitems_noempty AS
    SELECT colA,
    regexp_replace(colB, '^$', 'NULL') AS colB,
    regexp_replace(colC, '^$', 'NULL') AS colC,
    regexp_replace(colD, '^$', 'NULL') AS colD,
    regexp_replace(colE, '^$', 'NULL') AS colE,
    regexp_replace(colF, '^$', 'NULL') AS colF
    FROM tbl_myitems_deduped
    WHERE LENGTH(colA) > 0;

# ...other preprocessing here...

# insert to DB
hive> INSERT INTO TABLE ddb_tbl_myitems
    SELECT * FROM tbl_myitems_noempty;

참고 : colA는 파티션 키입니다.

해결법

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

    1.지정된 문자를 널값으로 취급하는 테이블 작성 명령문에 테이블 특성을 추가 할 수 있습니다.

    지정된 문자를 널값으로 취급하는 테이블 작성 명령문에 테이블 특성을 추가 할 수 있습니다.

    TBLPROPERTIES('serialization.null.format'='');
    
  2. from https://stackoverflow.com/questions/37566932/importing-a-csv-file-with-empty-strings-and-duplicates-into-dynamodb by cc-by-sa and MIT license