17

Tôi đang cố gắng sử dụng EMR/Hive để nhập dữ liệu từ S3 vào DynamoDB. Tệp CSV của tôi có các trường được đặt trong dấu ngoặc kép và được phân tách bằng dấu phẩy. Trong khi tạo bảng bên ngoài trong hive, tôi có thể chỉ định dấu phân tách làm dấu phẩy nhưng làm cách nào để xác định các trường được đính kèm trong dấu ngoặc kép?Cách xử lý các trường được đính kèm trong dấu ngoặc kép (CSV) trong việc nhập dữ liệu từ S3 vào DynamoDB sử dụng EMR/Hive

Nếu tôi không chỉ định, tôi thấy rằng các giá trị trong DynamoDB được điền trong hai dấu ngoặc kép "" giá trị "" có vẻ sai.

Tôi đang sử dụng lệnh sau để tạo bảng bên ngoài. Có cách nào để chỉ định rằng các trường được đính kèm trong dấu ngoặc kép?

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

Mọi đề xuất sẽ được đánh giá cao. Cảm ơn Jitendra

Trả lời

3

Nếu bạn đang mắc kẹt với các định dạng tập tin CSV, bạn sẽ phải sử dụng một SerDe tùy chỉnh; và đây là một số work based on the opencsv libarary.

Tuy nhiên, nếu bạn có thể sửa đổi tệp nguồn, bạn có thể chọn dấu phân tách mới để trường được trích dẫn không cần thiết (chúc may mắn) hoặc viết lại để thoát bất kỳ dấu phẩy được nhúng nào bằng một ký tự thoát duy nhất, ví dụ: '\', Có thể được quy định trong FORMAT ROW với bỏ trốn bằng cách:

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

Hive không hỗ trợ chuỗi được trích dẫn ngay ngoài hộp. Có hai cách để giải quyết vấn đề này:

  1. Sử dụng dấu tách trường khác (ví dụ: ống).
  2. Viết InputFormat tùy chỉnh dựa trên OpenCSV.

Cách tiếp cận nhanh hơn (và được cho là lành mạnh hơn) là sửa đổi quy trình xuất ban đầu của bạn để sử dụng dấu tách khác để bạn có thể tránh chuỗi được trích dẫn. Bằng cách này bạn có thể nói với Hive sử dụng một bảng bên ngoài với một tab hoặc ống delimiter:

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

Tôi cũng đã bị mắc kẹt với những vấn đề tương tự như các lĩnh vực của tôi có kèm theo dấu ngoặc kép và cách nhau bằng dấu chấm phẩy (;). Tên bảng của tôi là employee1.

Vì vậy, tôi đã tìm kiếm bằng các liên kết và tôi đã tìm thấy giải pháp hoàn hảo cho việc này.

Chúng ta phải sử dụng serde cho việc này. Xin vui lòng tải serde jar sử dụng liên kết này: https://github.com/downloads/IllyaYalovyy/csv-serde/csv-serde-0.9.1.jar

sau đó làm theo các bước dưới đây sử dụng dấu nhắc hive:

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 
; 

và sau đó tải dữ liệu từ con đường cho bạn sử dụng dưới đây truy vấn:

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

và sau đó chạy :

select * from employee1; 

Bây giờ bạn sẽ thấy sự kỳ diệu. Cảm ơn.

+0

Tôi nghĩ rằng đây sẽ là câu trả lời 'đúng'. Bất kỳ ai? Chỉ một điều, thay đổi "\" "thành '\"' nếu mã của bạn không chạy. – kennyut

+0

Trong trường hợp bất kỳ ai gặp lại điều này một lần nữa. Giờ đây, Hive bao gồm 'org.apache.hadoop.hive.serde2.OpenCSVSerde' ra khỏi hộp. Xem câu trả lời của tôi dưới đây. –

1

Sử dụng csv-serde-0.9.1.jar tập tin trong truy vấn hive của bạn, xem 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

Giờ đây, bao gồm một OpenCSVSerde sẽ phân tích cú pháp đúng các trường được trích dẫn mà không thêm các lọ bổ sung hoặc regex dễ bị lỗi và chậm.

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

10

mã sau giải quyết cùng một loại vấn đề

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"); 
Các vấn đề liên quan