2015-07-28 24 views
9

Mẫu xây dựng truy vấn chung trong HiveQL (và SQL nói chung) là chọn tất cả các cột (SELECT *) hoặc một nhóm cột được chỉ định rõ ràng (SELECT A, B, C). SQL không có cơ chế tích hợp để chọn tất cả trừ một tập hợp các cột được chỉ định.Hive UDF để chọn tất cả trừ một số cột

Có nhiều cơ chế khác nhau để loại trừ một số cột như được nêu trong this SO question nhưng không áp dụng tự nhiên nào cho HiveQL. (Ví dụ, ý tưởng để tạo một bảng tạm thời với SELECT * sau đó ALTER TABLE DROP một số cột của nó sẽ tàn phá trong môi trường dữ liệu lớn.)

Bỏ qua cuộc thảo luận ý thức hệ về việc chọn ý tưởng hay không là chọn tất cả trừ một số cột , câu hỏi này là về những cách có thể để mở rộng Hive với khả năng này.

Trước khi chọn Hive 0.13.0 SELECT có thể sử dụng các cột dựa trên biểu thức chính quy, ví dụ: property_.* bên trong chuỗi được trích dẫn ngược. Câu trả lời của @ invoketheshell dưới đây đề cập đến khả năng này nhưng nó có chi phí, tức là khi khả năng này được bật, Hive không thể chấp nhận các cột có các ký tự không chuẩn trong chúng, ví dụ: $foo hoặc x/y. Đó là lý do tại sao các nhà phát triển Hive tắt hành vi này theo mặc định trong 0.13.0. Tôi đang tìm một giải pháp chung mà làm việc cho bất kỳ tên cột.

Một UDF tạo bảng chung (UDTF) chắc chắn có thể làm điều này vì nó có thể manipulate the schema. Vì chúng ta sẽ không tạo ra các hàng mới, có cách nào để giải quyết vấn đề này bằng cách sử dụng một UDF dựa trên hàng đơn giản không?

Điều này có vẻ như là một vấn đề phổ biến với nhiều bài đăng trên Web cho thấy cách giải quyết nó cho các cơ sở dữ liệu khác nhau nhưng tôi chưa thể tìm ra giải pháp cho Hive. Có mã ở đâu đó thực hiện điều này không?

+1

Lỗi chưa được giải quyết này có thể gây ra sự cố, vì điều đó có nghĩa là bạn không thể thực hiện UDF, ví dụ: all_except (*, excluded_column1, excluded_column2) https://issues.apache.org/jira/browse/HIVE-1459 – mattinbits

+0

Cảm ơn @mattinbits. Tôi đã bỏ phiếu cho vấn đề và khuyến khích người khác làm như vậy. – Sim

Trả lời

8

Bạn có thể chọn mọi cột ngoại trừ cột được liệt kê trong đặc điểm kỹ thuật dựa trên regex. Đây là cột truy vấn theo loại trừ. Xem bên dưới:

Tuyên bố SELECT có thể lấy thông số cột dựa trên regex trong bản phát hành Hive trước 0.13.0 hoặc trong phiên bản 0.13.0 và sau đó nếu thuộc tính cấu hình hive.support.quoted.identifiers được đặt thành không.

Điều đó đang được nói rằng bạn có thể tạo ra một bảng mới hoặc xem bằng cách sử dụng sau đây, và tất cả các cột, trừ các cột chỉ định sẽ được trả lại:

hive.support.quoted.identifiers=none;  

drop table if  exists database.table_name; 
create table if not exists database.table_name as 
    select `(column_to_remove_1|...|column_to_remove_N)?+.+` 
    from database.some_table 
    where 
    --... 
; 

này sẽ tạo ra một bảng có tất cả các cột từ some_table ngoại trừ các cột có tên column_to_remove_1, ..., đến column_to_remove_N. Bạn cũng có thể chọn tạo chế độ xem thay thế.

+0

Bạn thực hiện một điểm tốt nhưng hành vi bạn mô tả không chung chung vì nó không cho phép các cột có các ký tự không chuẩn trong chúng, đó là lý do tại sao nó bị tắt theo mặc định trong phiên bản 0.13.0 và phiên bản mới hơn. Tôi đã cập nhật câu hỏi để làm rõ rằng tôi tìm kiếm một hành vi không phụ thuộc vào cài đặt này. – Sim

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