2013-05-23 37 views
12

Tôi có một bảng bên ngoài hive ánh xạ tới một số thư mục. Thư mục này bao gồm một số tệp.cách lấy tên tệp đầu vào làm cột trong truy vấn hive

Tôi muốn chạy truy vấn như tên tập tin tìm nơi có một người dùng "abc"

select file_name , usr from usrs_tables where usr = "abc" 

Nhưng tất nhiên dữ liệu không bao gồm tên tập tin bên trong.

Trong MapReduce tôi có thể làm điều đó bằng cách

FileSplit fileSplit = (FileSplit)context.getInputSplit(); 
String filename = fileSplit.getPath().getName(); 
System.out.println("File name "+filename); 
System.out.println("Directory and File name"+fileSplit.getPath().toString()); 

Làm thế nào tôi có thể làm điều đó trong Hive?

Trả lời

29

Vâng, bạn có thể lấy file bản ghi được tìm thấy trong việc sử dụng cột ảo có tên INPUT__FILE__NAME, ví dụ:

select INPUT__FILE__NAME, id, name from users where ...; 

mang lại một cái gì đó như:

hdfs://localhost.localdomain:8020/user/hive/warehouse/users/users1.txt 2 user2 
hdfs://localhost.localdomain:8020/user/hive/warehouse/users/users2.txt 42 john.doe 

Nếu cần thiết, sử dụng cung cấp string functions để cắt máy chủ và thư mục khỏi uri.

Bạn có thể tìm tài liệu trên các cột ảo ở đây: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+VirtualColumns

+0

Tuyệt vời, Cảm ơn rất nhiều! – Julias

+0

Cảm ơn rất nhiều !. Nó rất hữu ích! Đặc biệt, nếu chúng ta tìm kiếm một số lượng lớn các tệp nhật ký được tạo dưới dạng bảng hive bên ngoài, chúng ta sẽ biết tên tệp phù hợp để có thêm thông tin chi tiết. – Sakthivel

+1

@jkovacs có tương đương với INPUT__FILE__NAME trong Presto không? –

3

Mỗi bảng trong Hive có hai cột ảo. Họ là

  1. INPUT__FILE__NAME
  2. BLOCK__OFFSET__INSIDE__FILE

INPUT__FILE__NAME cho tên của tập tin. BLOCK__OFFSET__INSIDE__FILE là vị trí tệp toàn cầu hiện tại. Giả sử nếu chúng ta muốn tìm tên của tệp tương ứng với mỗi bản ghi trong một tệp. Chúng ta có thể sử dụng cột INPUT__FILE__NAME. Tính năng này có sẵn từ các phiên bản Hive trên 0.8. Một ví dụ nhỏ được đưa ra dưới đây.

Query

select INPUT__FILE__NAME, name from customer_data; 

này sẽ cung cấp cho chúng tôi biết tên tập tin tương ứng với mỗi bản ghi. Nếu bạn muốn lấy tên tệp tương ứng với bảng hive, truy vấn dưới đây sẽ giúp bạn.

select distinct(INPUT__FILE__NAME) from customer_data; 
Các vấn đề liên quan