2012-11-14 31 views
12

Tôi nhận được giá trị null trong khi tải dữ liệu từ tệp phẳng vào bảng hive.
cấu trúc bảng của tôi là như thế này:nhận giá trị null trong khi tải dữ liệu từ tệp phẳng vào bảng hive

hive> create table test_hive (id int,value string); 

và tập tin căn hộ của tôi là như thế này: INPUT.TXT

1 a 
2 b 
3 c 
4 d 
5 e 
6 F 
7 G 
8 j 

khi tôi chạy các lệnh dưới đây tôi nhận được các giá trị null:

hive> LOAD DATA LOCAL INPATH '/home/hduser/input.txt' OVERWRITE INTO TABLE test_hive; 
hive> select * from test_hive; 
OK<br> 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 

ảnh chụp màn hình:

hive> create table test_hive (id int,value string); 
OK 
Time taken: 4.97 seconds 
hive> show tables; 
OK 
test_hive 
Time taken: 0.124 seconds 
hive> LOAD DATA LOCAL INPATH '/home/hduser/input2.txt' OVERWRITE INTO TABLE test_hive; 
Copying data from file:/home/hduser/input2.txt 
Copying file: file:/home/hduser/input2.txt 
Loading data to table default.test_hive 
Deleted hdfs://hydhtc227141d:54310/app/hive/warehouse/test_hive 
OK 
Time taken: 0.572 seconds 
hive> select * from test_hive; 
OK 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
NULL NULL 
Time taken: 0.182 seconds 
+2

Có thể bạn cần xác định cách hàng/cột được phân tách trong tệp đầu vào khi tải vào bảng Hive.Bạn có thể thử một cái gì đó như: 'tạo bảng test_hive (id int, chuỗi giá trị) ROW FORMAT DELIMITED FIELDS TERMINATED BY '' LƯU TRỮ TEXTFILE VỊ TRÍ '/ người dùng/hadoop/hive/đầu vào';' –

+0

Vấn đề bạn đang phải đối mặt là bởi vì trong của bạn dữ liệu các trường được phân cách bởi '' và trong khi tạo bảng bạn không đề cập đến dấu phân tách trường. Vì vậy, nếu bạn không đề cập đến dấu phân cách trường trong khi tạo bảng hive, theo mặc định, hive xem^A làm dấu phân cách. Vì vậy, để giải quyết vấn đề của bạn, bạn có thể tạo lại bảng đề cập đến cú pháp dưới đây và nó sẽ hoạt động. TẠO BẢNG TABLE test_hive (id INT, giá trị STRING) ĐỊNH DẠNG ROW TẮT L FII TẮT B'NG ''; –

Trả lời

16

Trình kết thúc trường mặc định trong Hive là^A. Bạn cần phải đề cập một cách rõ ràng trong câu lệnh tạo bảng của bạn rằng bạn đang sử dụng một dấu tách trường khác.

Tương tự như những gì Lorand uốn chỉ trong các bình luận, sử dụng:

CREATE TABLE test_hive(id INT, value STRING) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '; 

Bạn không cần phải xác định một vị trí kể từ khi bạn đang tạo ra một bảng quản lý (và không phải là một bảng bên ngoài).

1

Hive của danh sách kỷ lục mặc định và lĩnh vực delimiters:

  1. \ n

  2. ^Một

  3. ^B

  4. ^C

nhấn^V^A có thể chèn^A vào Vim.

1

Các phần tử được phân cách bằng dấu cách hoặc tab? Hãy để tab của nó theo các bước sau. Nếu khoảng cách được tách biệt sử dụng '' thay vì '\ t' Ok.

hive> CREATE TABLE test_hive(id INT, value STRING) row format 
    delimited fields terminated by '\t' line formated by '\n' stored as filename; 

Hơn bạn phải nhập

hive> LOAD DATA LOCAL INPATH '/home/hduser/input.txt' OVERWRITE INTO TABLE test_hive; 

hive> select * from test_hive; 

Bây giờ bạn sẽ nhận được chính xác kết quả mong muốn của bạn "filename".

1

Giải pháp khá đơn giản. Bảng không được tạo đúng cách.

Giải pháp đơn giản cho sự cố của bạn hoặc bất kỳ vấn đề nào khác là biết cách tải dữ liệu.

CREATE TABLE [NẾU KHÔNG TỒN TẠI] mytableName (id int, chuỗi giá trị)

ROW FORMAT phân

LĨNH VỰC chấm dứt bởi '/ t'

LƯU AS textfile;

Bây giờ lemme giải thích mã:

  1. First Line Tạo bảng của bạn. [IF NOT EXIST] là tùy chọn cho biết bảng tồn tại không ghi đè lên nó. Đó là biện pháp an toàn hơn.

  2. Dòng thứ hai Chỉ định dấu tách ở cấp bảng cho trường có cấu trúc.

  3. Mục thứ ba Bạn có thể bao gồm bất kỳ ký tự đơn nào, nhưng mặc định là '\ 001'. '/ t' dành cho không gian tab: trong trường hợp của bạn '|' dành cho dữ liệu nằm cạnh nhau và được phân cách bởi | '' cho một không gian char. Và cứ như vậy ...

  4. Dòng Forth: Chỉ định loại tệp mà dữ liệu sẽ được lưu trữ. Tệp có thể là TEXTFILE, SEQUENCEFILE, RCFILE hoặc BINARY SEQUENCEFILE. Hoặc, cách dữ liệu được lưu trữ có thể được chỉ định như các lớp đầu vào và đầu ra Java.

khi tải tại địa phương:

LOCD DỮ LIỆU ĐỊA PHƯƠNG INPATH '/your/data/path.csv' [OVERWRITE] VÀO BẢNG myTableName;

Luôn thử kiểm tra dữ liệu của bạn bằng một câu lệnh * chọn đơn giản.

Hy vọng điều đó sẽ hữu ích.

6

Sự cố bạn đang gặp phải là do trong dữ liệu của bạn, các trường được phân tách bằng dấu '' và trong khi tạo bảng bạn không đề cập đến dấu phân tách trường. Vì vậy, nếu bạn không đề cập đến dấu phân cách trường trong khi tạo bảng hive, theo mặc định, hive xem^A làm dấu phân cách.

Vì vậy, để giải quyết vấn đề của bạn, bạn có thể tạo lại bảng đề cập đến cú pháp dưới đây và nó sẽ hoạt động.

CREATE TABLE test_hive(id INT, value STRING) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ';

+0

Trong ví dụ máy khách Apache HiveServer2, họ sử dụng tệp phân tách "Ctrl-A" (a.txt) để tải dữ liệu vào bảng. Trước hết họ không bao gồm tập tin này và thứ hai tôi muốn họ cung cấp thêm thông tin về điều đó. – kostia

0

hãy kiểm tra các cột ngày dataset nó nên làm theo các định dạng ngày YYYY-MM-DD Nếu chuỗi có dạng 'YYYY-MM-DD', sau đó một giá trị ngày tháng tương ứng với năm/tháng/ngày được trả về. Nếu giá trị chuỗi không khớp với định dạng này thì NULL được trả về.

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-date

+0

@ B.Desai Cảm ơn, tôi đã theo dõi doc.please hive có tôi nhìn vào liên kết đính kèm –