2013-08-20 35 views
6

Dựa trên tutorial sau đây, Hive có loại bản đồ. Tuy nhiên, dường như không có cách nào được ghi tài liệu để chèn cặp khóa-giá trị mới vào bản đồ Hive, qua một số SELECT với một số chức năng UDF hoặc tích hợp sẵn. Điều này có thể không?Làm cách nào để chèn cặp khóa-giá trị vào bản đồ hive?

Làm rõ, giả sử tôi có một bảng gọi là foo với một cột, được nhập map, có tên column_containing_map.

Bây giờ tôi muốn tạo một bảng mới cũng có một cột, nhập map, nhưng tôi muốn mỗi bản đồ (được chứa trong một cột) để có cặp khóa-giá trị bổ sung.

Một truy vấn có thể trông như thế này:

CREATE TABLE IF NOT EXISTS bar AS 
SELECT ADD_TO_MAP(column_containing_map, "NewKey", "NewValue") 
FROM foo; 

Sau đó bảng bar sẽ chứa các bản đồ tương tự như bảng foo trừ mỗi bản đồ trong bar sẽ có thêm một cặp khóa-giá trị.

Trả lời

0

Tôi xin lỗi, tôi đã không nhận được điều này. Điều gì làm bạn có nghĩa là bởi với một số UDF hoặc chức năng được xây dựng trong? Nếu bạn muốn chèn vào một bảng có một trường Bản đồ nó tương tự như bất kỳ kiểu dữ liệu nào khác. Ví dụ:

Tôi có một bảng gọi là complex1, tạo ra như thế này:

CREATE TABLE complex1(c1 array<string>, c2 map<int,string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '-' MAP KEYS TERMINATED BY ':' LINES TERMINATED BY '\n'; 

Tôi cũng có một tập tin, gọi com.txt, chứa này: Mohammad-Tariq, 007: Bond

Bây giờ, tôi sẽ nạp dữ liệu này vào bảng đã tạo ở trên:

tải dữ liệu inpath '/inputs/com.txt' vào bảng phức tạp1;

Vì vậy, bảng này chứa:

select * from complex1;

OK

[ "Mohammad", "Tariq"] {7: "Bond"}

Thời gian thực hiện: 0.062 giây

tôi có thêm một bảng, gọi complex2:

CREATE TABLE complex2(c1 map<int,string>); 

Bây giờ, để chọn dữ liệu từ complex1 và chèn vào complex2 tôi sẽ làm điều này:

chèn

vào bảng complex2 chọn c2 từ complex1;

Quét bảng để vượt qua kiểm tra:

select * from complex2;

OK

{7: "Bond"}

Thời gian thực hiện: 0.062 giây

HTH

+0

Xin chào Tariq, vui lòng xem các chỉnh sửa của tôi cho câu hỏi. – merlin2011

0

Tôi nghĩ rằng kết hợp chức năng từ brickhouse sẽ làm những gì bạn cần. Hơi sửa đổi các truy vấn trong câu hỏi ban đầu của bạn, nó sẽ giống như thế này

SELECT 
    combine(column_containing_map, str_to_map("NewKey:NewValue")) 
FROM 
    foo; 

Giới hạn với ví dụ này là str_to_map tạo ra một STRING MAP <, STRING>. Nếu bản đồ hive của bạn chứa các kiểu nguyên thủy khác cho các khóa hoặc giá trị, thì nó sẽ không hoạt động.

3

Hãy xem xét bạn có bảng học sinh có chứa các dấu chấm của học sinh trong các môn học khác nhau.

hive> desc student; 
id      string 
name     string 
class     string 
marks     map<string,string> 

Bạn có thể chèn giá trị trực tiếp vào bảng như sau.

INSERT INTO TABLE student 
SELECT STACK(1, 
'100','Sekar','Mathematics',map("Mathematics","78") 
) 
FROM empinfo 
LIMIT 1; 

Bảng 'empinfo' này có thể là bất kỳ bảng nào trong cơ sở dữ liệu của bạn. Và kết quả là:

100  Sekar Mathematics  {"Mathematics":"78"} 
+1

Ví dụ đã thử chính xác như được đưa ra trên Hive MapR 5 và nhận được lỗi sau 'FAILED: SemanticException [Lỗi 10293]: Không thể tạo tệp tạm thời cho giá trị chèn Biểu thức loại TOK_FUNCTION không được hỗ trợ trong chèn/giá trị Không có bản đồ 'trường trong cấu trúc bảng, truy vấn chèn giá trị không có vấn đề –

Các vấn đề liên quan