私はAmazon DynamoDBにインポートしようとしているCSVファイルを持っています。だから私は、S3にアップロードEMRクラスタを設定し、このような外部表を作成します。CSVファイル(空の文字列と重複を含む)をDynamoDBにインポート
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: One or more parameter values were invalid: An AttributeValue may not contain an empty string
")。
これは何Amazon saysです:
私たちは、このオプションが 将来のリリースでの動作「空の文字列を無視し、」検討します。 ...回避策として、空の の属性値をNULLに変換できます。たとえば、より複雑な SELECT式を使用して、空の文字列を別のものに変換することができます。 をNULLに設定します。
は、これは私が思い付いたものですが、それは醜い:
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: Provided list of item keys contains duplicates
")重複に対処することになりました。
後生については、ここに私の完全な流れがあります。私はこれを行うためのより良い方法を、美学とパフォーマンスの両方について聞きたいと思います。タスクは一見シンプルです(「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
は、パーティション・キーです。
同じ問題が発生しました。私は若干異なったものを解決しましたが、空の文字列の問題に直面しています。私はOpenCSVSerdeのSerDeプロパティーと、それまでの唯一の答えで言及したようなTBLPROPERTIESの中で、 ''serialization.null.format' = '' '''を使ってみました。 –