[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.지정된 문자를 널값으로 취급하는 테이블 작성 명령문에 테이블 특성을 추가 할 수 있습니다.
지정된 문자를 널값으로 취급하는 테이블 작성 명령문에 테이블 특성을 추가 할 수 있습니다.
TBLPROPERTIES('serialization.null.format'='');
from https://stackoverflow.com/questions/37566932/importing-a-csv-file-with-empty-strings-and-duplicates-into-dynamodb by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] YARN Dr.who 응용 프로그램 시도 시도 실패 (0) | 2019.08.09 |
---|---|
[HADOOP] Hadoop Hive-Hive JDBC 클라이언트와 함께 사용하기 위해 'jar'을 추가하려면 어떻게해야합니까? (0) | 2019.08.09 |
[HADOOP] 하둡 청크 크기 대 분할 대 블록 크기 (0) | 2019.08.09 |
[HADOOP] 스트리밍 작업을 위해 Hadoop 노드에 R 패키지를 임시로 설치 (0) | 2019.08.09 |
[HADOOP] MapReduce 작업에서 Hive에 파티션 추가 (0) | 2019.08.09 |