2012-11-29 33 views
30

Tôi cố gắng để tải tập tin CSV vào một bảng Hive như vậy:Hive tải CSV bằng dấu phẩy trong các lĩnh vực trích dẫn

CREATE TABLE mytable 
(
num1 INT, 
text1 STRING, 
num2 INT, 
text2 STRING 
) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ","; 

LOAD DATA LOCAL INPATH '/data.csv' 
OVERWRITE INTO TABLE mytable;  


Các csv được giới hạn bởi một dấu phẩy (,) và trông như thế này:

1, "some text, with comma in it", 123, "more text" 

Điều này sẽ trả về dữ liệu bị hỏng vì có ',' trong chuỗi đầu tiên.
Có cách nào để đặt dấu phân cách văn bản hoặc đặt Hive bỏ qua ',' trong chuỗi không?

Tôi không thể thay đổi dấu phân cách của csv vì nó được lấy từ nguồn bên ngoài.

Trả lời

24

Vấn đề là Hive không xử lý văn bản được trích dẫn. Bạn cần phải xử lý trước dữ liệu bằng cách thay đổi dấu phân cách giữa các trường (ví dụ: với công việc phát trực tuyến Hadoop) hoặc bạn cũng có thể thử sử dụng tùy chỉnh CSV SerDe sử dụng OpenCSV để phân tích cú pháp tệp.

+0

Cảm ơn điều đó đã xảy ra! –

+0

sed -i 's/"// g' your_file_name thực hiện quá trình tiền xử lý bằng cách xóa văn bản được trích dẫn. Tuy nhiên, bạn CẦN phải chắc chắn rằng không có loại bỏ vô tội các ký tự được trích dẫn khác ("). – ekta

25

Nếu bạn có thể tái tạo hoặc phân tích dữ liệu đầu vào của bạn, bạn có thể chỉ định một nhân vật thoát cho TABLE CREATE:

ROW FORMAT DELIMITED FIELDS TERMINATED BY "," ESCAPED BY '\\'; 

có chấp nhận dòng này như 4 lĩnh vực

1,some text\, with comma in it,123,more text 
+2

Điều đó xử lý các dấu phẩy được nhúng, chứ không phải các dòng mới được nhúng, đó là các dấu khác trong dữ liệu CSV. Hoặc các dòng mới cũng có thể được thoát ra không? Thông số tại https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTable dường như không cho phép thoát khỏi dòng mới. –

14

Tính Hive 0.14, CSV SerDe là một phần tiêu chuẩn của Hive cài đặt

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

(Xem: https://cwiki.apache.org/confluence/display/Hive/CSV+Serde)

+0

Nếu HIVE của bạn được cập nhật, đây là câu trả lời hay nhất :) – bartektartanus

+0

Điều này cũng giúp tôi! – Kulasangar

+1

Khi bạn sử dụng OpenCSVSerde có cách nào để xác định Null được xác định không? Sử dụng "ROW FORMAT DELIMITED" Tôi có thể thêm tùy chọn "NULL DEFINED AS" "để nhận ra giá trị null trong dữ liệu. – JeffR

0

giữ dấu tách trong dấu nháy đơn nó sẽ hoạt động.

ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n'; 

này sẽ làm việc

0

Thêm một dấu gạch chéo ngược trong các lĩnh vực chấm dứt bởi '\;'

Ví dụ:

CREATE TABLE demo_table_1_csv 
COMMENT 'my_csv_table 1' 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\;' 
LINES TERMINATED BY '\n' 
STORED AS TEXTFILE 
LOCATION 'your_hdfs_path' 
AS 
select a.tran_uuid,a.cust_id,a.risk_flag,a.lookback_start_date,a.lookback_end_date,b.scn_name,b.alerted_risk_category, 
CASE WHEN (b.activity_id is not null) THEN 1 ELSE 0 END as Alert_Flag 
FROM scn1_rcc1_agg as a LEFT OUTER JOIN scenario_activity_alert as b ON a.tran_uuid = b.activity_id; 

Tôi đã thử nghiệm nó, và nó làm việc.