2013-07-02 41 views
37

Tôi mới làm tổ, và muốn biết liệu có chèn dữ liệu vào bảng hive như chúng ta làm trong SQL hay không. Tôi muốn chèn dữ liệu của tôi vào tổ ong nhưTruy vấn chèn Hive như SQL

INSERT INTO tablename VALUES (value1,value2..) 

Tôi đã đọc mà bạn có thể tải dữ liệu từ một tập tin vào hive bảng hoặc bạn có thể nhập dữ liệu từ một bảng để hive bảng nhưng có cách nào để phụ thêm dữ liệu như trong SQL?

Trả lời

66

Một số các câu trả lời ở đây hết hạn như của Hive 0,14

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-InsertingvaluesintotablesfromSQL

Nó bây giờ có thể chèn sử dụng cú pháp như:

CREATE TABLE students (name VARCHAR(64), age INT, gpa DECIMAL(3, 2)); 

INSERT INTO TABLE students 
    VALUES ('fred flintstone', 35, 1.28), ('barney rubble', 32, 2.32); 
+0

Đây thực sự là câu trả lời hàng đầu (được chấp nhận). – xenocyon

+1

@mattinbits: Tôi đang cố gắng chèn một số được tạo theo thứ tự cho một cột và một dấu thời gian cho một cột khác. Để có dấu thời gian, tôi đã thử "from_unixtime (unix_timestamp())" trong câu lệnh chèn. Tôi nhận "SemanticException [ERROR 10293]: Không thể tạo tệp tạm thời để chèn giá trị Biểu thức loại TOK_FUNCTION không được hỗ trợ trong chèn/giá trị". Tôi không nhận được một ý tưởng rõ ràng về cách tôi có thể đạt được thế hệ số chuỗi. Bạn có thể vui lòng cung cấp một số yếu tố đầu vào về cách tôi có thể đạt được cả hai? Tôi đang sử dụng Hive 1.1.0. Cảm ơn. – Marco99

+0

@ Marco99 bạn nên nêu ra câu hỏi mới này – mattinbits

3

No. Cú pháp INSERT INTO tablename VALUES (x,y,z) này hiện không được hỗ trợ trong Hive.

+0

là có một con đường xung quanh để tôi có thể nối thêm dữ liệu trong bảng của tôi là chúng ta làm trong SQL. –

+1

'INSERT INTO tablename SELECT ...' được hỗ trợ, vì vậy bạn có thể đặt dữ liệu mới trong một bảng tạm thời và sau đó chèn bằng cách chọn từ đó. –

+0

Tôi muốn nối thêm dữ liệu trong hive thông qua máy khách java, nó sẽ hoạt động nếu tôi tạo một bảng dữ liệu tạm thời trong java và viết một truy vấn chèn và chọn trong máy khách java của tôi? –

1

Bạn không thể chèn vào để chèn bản ghi duy nhất. Nó không được Hive hỗ trợ. Bạn có thể đặt tất cả các bản ghi mới mà bạn muốn chèn vào một tệp và tải tệp đó vào bảng tạm thời trong Hive. Sau đó, sử dụng chèn ghi đè ... chọn lệnh chèn các hàng đó vào một phân vùng mới của bảng Hive chính của bạn. Ràng buộc ở đây là bảng chính của bạn sẽ phải được phân vùng trước. Nếu bạn không sử dụng phân vùng thì toàn bộ bảng của bạn sẽ được thay thế bằng những bản ghi mới này.

+1

Không hoàn toàn chính xác. "INSERT INTO sẽ nối thêm vào bảng hoặc phân vùng giữ nguyên dữ liệu hiện có (Lưu ý: cú pháp INSERT INTO chỉ khả dụng bắt đầu từ phiên bản 0.8)" https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ DML # LanguageManualDML-InsertingdataintoHiveTablesfromqueries –

0

Tôi nghĩ rằng trong các trường hợp như vậy bạn nên sử dụng HBASE tạo điều kiện cho loại chèn như vậy nhưng nó không cung cấp bất kỳ loại ngôn ngữ truy vấn SQL nào. Bạn cần bạn sử dụng Java API của HBASE như phương pháp đặt để thực hiện loại chèn này. Hơn nữa HBASE là cơ sở dữ liệu không có cột sql theo định hướng cột.

5

Bạn chắc chắn có thể nối thêm dữ liệu vào bảng hiện có. (Nhưng nó thực sự không phải là một phụ thêm ở cấp HDFS). Nó chỉ là bất cứ khi nào bạn thực hiện một thao tác LOAD hoặc INSERT trên bảng Hive hiện có mà không có mệnh đề OVERWRITE thì dữ liệu mới sẽ được đặt mà không thay thế dữ liệu cũ. Một tệp mới sẽ được tạo cho dữ liệu mới được chèn vào bên trong thư mục tương ứng với bảng đó. Ví dụ:

Tôi có một file có tên demo.txt trong đó có 2 dòng:

ABC 
XYZ 

Tạo một bảng và tải tập tin này vào nó

hive> create table demo(foo string); 
hive> load data inpath '/demo.txt' into table demo; 

Bây giờ, nếu tôi làm một SELECT trên bảng này nó sẽ cho tôi:

hive> select * from demo;       
OK  
ABC  
XYZ 

Giả sử, tôi có một tập tin hơn tên demo2.txt trong đó có:

PQR 

Và tôi làm một LOAD một lần nữa trên bảng này mà không sử dụng ghi đè lên,

hive> load data inpath '/demo2.txt' into table demo; 

Bây giờ, nếu tôi làm một SELECT bây giờ, nó sẽ cung cấp cho tôi,

hive> select * from demo;      
OK 
ABC 
XYZ 
PQR 

HTH

15

Bạn có thể sử dụng ngăn xếp hàm tạo bảng để chèn các giá trị chữ vào bảng.

Trước tiên, bạn cần một bảng giả chỉ chứa một dòng. Bạn có thể tạo ra nó với sự giúp đỡ của giới hạn.

CREATE TABLE one AS 
SELECT 1 AS one 
FROM any_table_in_your_database 
LIMIT 1; 

Bây giờ bạn có thể tạo một bảng mới với các giá trị văn chương như thế này:

CREATE TABLE my_table AS 
SELECT stack(3 
    , "row1", 1 
    , "row2", 2 
    , "row3", 3 
) AS (column1, column2) 
FROM one 
; 

Đối số đầu tiên của ngăn xếp là số hàng mà bạn đang tạo.

Bạn cũng có thể thêm giá trị cho một bảng hiện có:

INSERT INTO TABLE my_table 
SELECT stack(2 
    , "row4", 1 
    , "row5", 2 
) AS (column1, column2) 
FROM one 
; 
2

Có bạn có thể chèn nhưng không phải là tương tự như SQL.

Trong SQL, chúng tôi có thể chèn dữ liệu mức hàng, nhưng tại đây bạn có thể chèn theo trường (cột).

Trong thời gian này, bạn phải đảm bảo bảng mục tiêu và truy vấn phải có cùng kiểu dữ liệu và cùng một số cột.

ví dụ:

CREATE TABLE test(stu_name STRING,stu_id INT,stu_marks INT) 
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY ',' 
STORED AS TEXTFILE; 

INSERT OVERWRITE TABLE test SELECT lang_name, lang_id, lang_legacy_id FROM export_table; 
5

Bạn có thể sử dụng dưới đây cách tiếp cận. Với điều này, bạn không cần tạo bảng tạm thời hoặc tệp txt/csv để tiếp tục chọn và tải tương ứng.

INSERT INTO TABLE tablename SELECT value1,value2 FROM tempTable_with_atleast_one_records LIMIT 1. 

đâu tempTable_with_atleast_one_records là bất kỳ bảng với ít nhất một bản ghi.

Nhưng vấn đề với cách tiếp cận này là nếu bạn có câu lệnh INSERT chèn nhiều hàng như dưới đây.

INSERT INTO yourTable values (1 , 'value1') , (2 , 'value2') , (3 , 'value3') ; 

Sau đó, bạn cần có câu lệnh INSERT hive riêng biệt cho mỗi hàng. Xem bên dưới.

INSERT INTO TABLE yourTable SELECT 1 , 'value1' FROM tempTable_with_atleast_one_records LIMIT 1; 
INSERT INTO TABLE yourTable SELECT 2 , 'value2' FROM tempTable_with_atleast_one_records LIMIT 1; 
INSERT INTO TABLE yourTable SELECT 3 , 'value3' FROM tempTable_with_atleast_one_records LIMIT 1; 
9

Hơi tốt hơn phiên bản của đề nghị unique2 là dưới đây:

insert overwrite table target_table 
select * from 
(
select stack(
    3,     # generating new table with 3 records 
    'John', 80,  # record_1 
    'Bill', 61   # record_2 
    'Martha', 101  # record_3 
    ) 
) s; 

nào không yêu cầu tấn công bằng cách sử dụng một bảng đã thoát.

2

Để chèn toàn bộ dữ liệu của table2 trong table1. Dưới đây là một truy vấn:

INSERT INTO TABLE table1 SELECT * FROM table2; 
1

Nhập lệnh sau đây để chèn dữ liệu vào bảng testlog với một số điều kiện:

INSERT INTO TABLE testlog SELECT * FROM table1 WHERE some condition;