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?
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
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