17

我試圖使用EMR/Hive將數據從S3導入到DynamoDB中。我的CSV文件的字段用雙引號括起來,並用逗號分隔。 在配置單元中創建外部表時,我可以將分隔符指定爲逗號,但是如何指定將這些字段用引號括起來?如何處理使用EMR/Hive將數據從S3導入到DynamoDB中的引用(CSV)中的字段

如果我沒有指定,我看到DynamoDB中的值填充在兩個雙引號「」value「」中,這似乎是錯誤的。

我正在使用以下命令創建外部表。有沒有辦法指定這些字段是用雙引號括起來的?

CREATE EXTERNAL TABLE emrS3_import_1(col1 string, col2 string, col3 string, col4 string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '","' LOCATION 's3://emrTest/folder'; 

任何意見,將不勝感激。 謝謝 Jitendra

回答

3

如果你堅持CSV文件格式,你必須使用自定義SERDE;這裏有一些work based on the opencsv libarary

但是,如果您可以修改源文件,則可以選擇一個新的分隔符,以便引用的字段不是必需的(祝您好運),或者重寫以使用單個轉義字符轉義任何嵌入的逗號。 「\」,它可以行格式內的ESCAPED BY指定:

CREATE EXTERNAL TABLE emrS3_import_1(col1 string, col2 string, col3 string, col4 string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ESCAPED BY '\\' LOCATION 's3://emrTest/folder'; 
2

蜂巢不支持引用字符串開箱即用。有兩種方法可以解決這個問題:

  1. 使用不同的字段分隔符(例如管道)。
  2. 編寫一個基於OpenCSV的自定義InputFormat。

更快(並且可以說更爲理智)的方法是修改您的初始導出過程以使用不同的分隔符,以避免引用字符串。這樣,你可以告訴蜂房使用外部表製表符或豎線分隔符:

CREATE TABLE foo (
    col1 INT, 
    col2 STRING 
) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|'; 
20

我也堅持同樣的問題,因爲我的農田包圍加上雙引號,並用分號(;)分隔。我的表名是employee1。

所以我用鏈接搜索,我找到了完美的解決方案。

我們必須爲此使用serde。請通過以下鏈接下載SERDE罐子:https://github.com/downloads/IllyaYalovyy/csv-serde/csv-serde-0.9.1.jar

然後按照以下方法使用蜂巢提示步驟操作:

add jar path/to/csv-serde.jar; 

create table employee1(id string, name string, addr string) 
row format serde 'com.bizo.hive.serde.csv.CSVSerde' 
with serdeproperties(
"separatorChar" = "\;", 
"quoteChar" = "\"") 
stored as textfile 
; 

,然後用下面的查詢從您指定的路徑加載數據:

load data local inpath 'path/xyz.csv' into table employee1; 

,然後運行:

select * from employee1; 

現在你會看到魔法。謝謝。

+0

我想,這應該是 '正確' 的答案。任何人?只是一件事,如果你的代碼沒有運行,把「\」「改成」\「。 – kennyut

+0

如果有人再次遇到這種情況。蜂巢現在包括'org.apache.hadoop.hive.serde2.OpenCSVSerde'開箱。請參閱下面的答案。 –

1

使用csv-serde-0.9.1.jar文件放在蜂巢查詢,請參閱 http://illyayalovyy.github.io/csv-serde/

add jar /path/to/jar_file 

Create external table emrS3_import_1(col1 string, col2 string, col3 string, col4 string) row format serde 'com.bizo.hive.serde.csv.CSVSerde' 
with serdeproperties 
(
    "separatorChar" = "\;", 
    "quoteChar" = "\" 
) stored as textfile 
tblproperties("skip.header.line.count"="1") ---to skip if have any header file 
LOCATION 's3://emrTest/folder'; 
3

蜂房現在包括一個OpenCSVSerde這將正確地解析無需增加額外的罐或易錯和緩慢的正則表達式的那些引用的字段。

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

10

下面的代碼解決同類型的問題

CREATE TABLE TableRowCSV2( 
    CODE STRING,   
    PRODUCTCODE STRING, 
    PRICE STRING  
) 
    COMMENT 'row data csv'  
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' 

WITH SERDEPROPERTIES (
    "separatorChar" = "\,", 
    "quoteChar"  = "\"" 
) 
STORED AS TEXTFILE 
tblproperties("skip.header.line.count"="1"); 
相關問題