2013-08-15 43 views
5

Tôi đã cố tạo các id duy nhất cho mỗi hàng của một bảng (30 triệu + hàng).tạo các id duy nhất trong hive

  • sử dụng các số tuần tự rõ ràng là không hoạt động do bản chất song song của Hadoop.
  • được xây dựng trong UDFs rand() và băm (rand(), unixtime()) dường như tạo ra xung đột.

Có một cách đơn giản để tạo id hàng và tôi tự hỏi có ai có giải pháp hay không.

  • Bước tiếp theo của tôi chỉ là tạo bản đồ Java giảm công việc để tạo chuỗi băm thực với thời gian hiện tại + IP + máy chủ ngẫu nhiên an toàn. nhưng tôi tìm tôi muốn hỏi ở đây trước khi làm việc đó;)
+0

Có bạn được coi là [UUID] (http://docs.oracle.com/javase/1.5.0/docs/api/java/util/UUID.html)? – climbage

Trả lời

15

Sử dụng phản ánh UDF để tạo UUID.

reflect("java.util.UUID", "randomUUID") 
+0

Chức năng này bị liệt vào danh sách đen trong hiveserver2. Có cách giải quyết nào để giải quyết vấn đề này hoặc có phương pháp thay thế để thực hiện việc này không? –

+0

@VinayKumar - theo tài liệu để phản ánh UDF - bạn có thể viết trình bao bọc UDF tùy chỉnh của riêng bạn cho randomUUID trả về giá trị. phản ánh chỉ đơn giản là một người trợ giúp để tránh bạn cần phải làm điều đó bất cứ lúc nào bạn muốn gọi một số phương thức Java phổ biến. – tswann

4

Không chắc nếu đây là tất cả những gì hữu ích, nhưng ở đây đi ...

Xem xét MapReduce analog mẹ đẻ: giả bộ dữ liệu đầu vào của bạn là dựa trên văn bản, khóa đầu vào của Mapper (và do đó duy nhất ID) sẽ là, cho mỗi dòng, tên của tập tin cộng với bù đắp byte của nó.

Khi bạn tải dữ liệu vào Hive, nếu bạn có thể tạo thêm 'cột' có thông tin này, bạn sẽ nhận được rowID miễn phí. Đó là ngữ nghĩa vô nghĩa, nhưng cũng vậy là cách tiếp cận bạn đề cập ở trên.

+0

Bất kỳ ai có thể cung cấp cho tôi mẫu, nhà phát triển .nET muốn triển khai chức năng bản đồ tùy chỉnh của tôi – user145610

0

Tùy thuộc vào bản chất công việc của bạn và mức độ thường xuyên bạn lên kế hoạch chạy chúng, sử dụng số tuần tự có thể thực sự là một lựa chọn hợp lý. Bạn có thể triển khai một UDF rank() như được mô tả trong this other SO question.

0

Xây dựng trên câu trả lời của jtravaglini, có 2 được xây dựng trong các cột ảo Hive từ 0.8.0 có thể được sử dụng để tạo ra một định danh duy nhất:

INPUT_ FILE _name, BLOCK_ OFFSET _INSIDE__FILE

Sử dụng như thế này:

chọn concat (INPUT_ FILE _NAME, ':', BLOCK_ OFFSET _INSIDE__FILE) làm dòng khóa,
...
;
...
OK
HDFS: //: 8020/user/dhdpadmn/đào tạo/training_data/NYSE/ngày/NYSE_daily2.txt: 0 HDFS: //: 8020/user/dhdpadmn/đào tạo/training_data/nyse/daily/NYSE_daily2.txt: 57 hdfs: //: 8020/người dùng/dhdpadmn/training/training_data/nyse/daily/NYSE_daily2.txt: 114 hdfs: //: 8020/user/dhdpadmn/training/training_data/nyse/daily/NYSE_daily2.txt: 171 hdfs: //: 8020/người dùng/dhdpadmn/training/training_data/nyse/daily/NYSE_daily2.txt: 228 hdfs: //: 8020/user/dhdpadmn/training/training_data/nyse/daily/NYSE_daily2.txt: 285 hdfs: //: 8020/người dùng/dhdpadmn/training/training_data/nyse/daily/NYSE_daily2.txt: 342
...

Hoặc bạn có thể anonomize rằng với md5 hoặc tương tự, đây là một liên kết đến md5 UDF: https://gist.github.com/dataminelab/1050002
(lưu ý tên hàm lớp được initcap 'md5')

chọn md5 (concat (INPUT_ FILE _name, ':', BLOCK_ OFFSET _INSIDE__FILE)) như rowkey, ...

0

phản ánh ("java.util.UUID", "randomUUID")

Tôi không thể bỏ phiếu cho người khác. Tôi cần một phiên bản nhị phân tinh khiết, vì vậy tôi sử dụng này:

unhex (regexp_replace (phản ánh ('java.util.UUID', 'randomUUID'), '-', ''))

0

Viết tùy chỉnh Trình ánh xạ giữ một bộ đếm cho mỗi tác vụ Bản đồ và tạo thành ID hàng cho một hàng nối của JobID() (như được lấy từ API MR) + giá trị hiện tại của bộ đếm. Trước khi hàng tiếp theo được kiểm tra, tăng bộ đếm.

0

Nếu bạn muốn làm việc với nhiều người vẽ bản đồ và với tập dữ liệu lớn, hãy thử sử dụng UDF này: https://github.com/manojkumarvohra/hive-hilo

Nó làm cho sử dụng của Zookeeper là kho trung tâm để duy trì trạng thái của trình tự và tạo ra giá trị số incrementing độc đáo

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