2016-06-01 28 views
3

私は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は、パーティション・キーです。

+0

同じ問題が発生しました。私は若干異なったものを解決しましたが、空の文字列の問題に直面しています。私はOpenCSVSerdeのSerDeプロパティーと、それまでの唯一の答えで言及したようなTBLPROPERTIESの中で、 ''serialization.null.format' = '' '''を使ってみました。 –

答えて

0

create tableステートメントに、指定した任意の文字をNULL値として扱う追加のテーブルプロパティを追加できます。

TBLPROPERTIES('serialization.null.format'=''); 
+0

私はそれを試みました。空の文字列は単にCSVの空の文字列なので、これは効果がありません。それらはnullではありません( '\ N')。 – jrc

+0

'^ $'のregexp_replace関数で指定した文字を使用した場合はどうなりますか? – Jared

関連する問題