2011-01-20 25 views
16

Có ai vui lòng giải thích khái niệm về giảm bản đồ, đặc biệt là ở Mongo không?Ai đó có thể giải thích bản đồ-giảm trong C#?

Tôi cũng sử dụng C# để mọi chi tiết cụ thể trong khu vực đó cũng sẽ hữu ích.

+0

IMHO, Câu trả lời hay nhất nằm ở đây. Mẫu cuối cùng nằm trong Ruby. [Blog của Kyle Banker - MongoDb Employee - resp. cho trình điều khiển Ruby] (http://kylebanker.com/blog/2009/12/mongodb-map-reduce-basics/) –

Trả lời

2

Bản đồ Giảm là một cách xử lý dữ liệu trong đó bạn có một giai đoạn bản đồ/chức năng xác định tất cả dữ liệu được xử lý và xử lý dữ liệu, theo từng hàng.

Sau đó, bạn có một bước giảm/chức năng có thể chạy nhiều lần, ví dụ một lần cho mỗi máy chủ trong một cụm và sau đó một lần trong khách hàng trả lại kết quả cuối cùng.

Dưới đây là một bài viết Wiki mô tả nó một cách chi tiết hơn:

http://en.wikipedia.org/wiki/MapReduce

Và đây là tài liệu cho MongoDB cho MapReduce

http://www.mongodb.org/display/DOCS/MapReduce

Ví dụ đơn giản, tìm chuỗi dài nhất một danh sách.

Bước bản đồ sẽ lặp qua danh sách tính toán độ dài của mỗi chuỗi, bước giảm sẽ lặp lại kết quả từ bản đồ và cho mỗi dòng giữ nguyên dài nhất.

Điều này có thể gây ra phức tạp hơn nhiều nhưng đó là bản chất của nó.

14

Here's a spot để bắt đầu với Map Reduce in Mongo. Sách dạy nấu ăn có một vài ví dụ, tôi sẽ tập trung vào thesetwo.

Tôi thích suy nghĩ về việc giảm bản đồ trong ngữ cảnh "công việc lưu trữ dữ liệu" hoặc "cuộn lên". Về cơ bản, bạn đang lấy dữ liệu chi tiết và "cuộn lên" một phiên bản nhỏ hơn của dữ liệu đó.

Trong SQL, bạn thường làm điều này với sum()avg()group by. Trong MongoDB bạn sẽ làm điều này với Map Reduce. Tiền đề cơ bản của Map Reduce là bạn có hai chức năng.

Chức năng đầu tiên (bản đồ) là một cách bài bản một for vòng khổng lồ chạy trên dữ liệu của bạn và "phát ra" nhất định phímgiá trị. Hàm thứ hai (reduce), là một vòng lặp khổng lồ trên tất cả các dữ liệu được phát ra. bản đồ nói "hey đây là dữ liệu bạn muốn tóm tắt" và giảm nói "hey mảng này giá trị giảm đến giá trị duy nhất này"

Kết quả từ một bản đồ giảm có thể đến ở nhiều dạng (thường là tệp phẳng). Trong MongoDB, đầu ra thực sự là một bộ sưu tập mới.

C# Chi tiết cụ thể

Trong MongoDB tất cả các Map Giảm được thực hiện bên trong của động cơ javascript. Vì vậy, cả bản đồ chức năng giảm bớt tất cả được viết bằng javascript. Các trình điều khiển khác nhau sẽ cho phép bạn xây dựng javascript và đưa ra lệnh, tuy nhiên, đây không phải là cách tôi thường làm điều đó.

Phương thức ưu tiên để chạy lệnh Map Reduce là biên dịch JS thành một tệp và sau đó mongo map_reduce.js. Nói chung bạn sẽ làm điều này trên máy chủ ở đâu đó như một công việc cron hoặc một nhiệm vụ theo lịch trình.

Tại sao?

Vâng, việc giảm bản đồ không phải là "thời gian thực", đặc biệt là với tập dữ liệu lớn. Nó thực sự được thiết kế để được sử dụng trong một thời trang hàng loạt. Đừng hiểu nhầm, bạn có thể gọi nó từ mã của bạn, nhưng nói chung, bạn không muốn người dùng bắt đầu công việc giảm bản đồ. Thay vào đó, bạn muốn những công việc đó được lên lịch và bạn muốn người dùng truy vấn kết quả :)

27

Một cách để hiểu Map-Reduce đến từ C# và LINQ là coi nó là SelectMany() theo sau là GroupBy(). Hoạt động Aggregate().

Trong một SelectMany() bạn đang chiếu một chuỗi nhưng mỗi phần tử có thể trở thành nhiều phần tử. Điều này tương đương với việc sử dụng nhiều câu lệnh emit trong hoạt động bản đồ của bạn. Thao tác trên bản đồ cũng có thể chọn không gọi phát xạ giống như có mệnh đề Where() bên trong hoạt động SelectMany() của bạn.

Trong một GroupBy() bạn đang thu thập các phần tử có cùng khóa mà Map-Reduce thực hiện với giá trị khóa mà bạn phát ra từ hoạt động bản đồ.

Trong các bước Aggregate() hoặc giảm bạn đang thực hiện các bộ sưu tập được liên kết với mỗi khóa nhóm và kết hợp chúng theo một cách nào đó để tạo ra một kết quả cho mỗi khóa. Thông thường, sự kết hợp này chỉ đơn giản là thêm một đầu ra giá trị '1' duy nhất với mỗi khóa từ bước bản đồ nhưng đôi khi nó phức tạp hơn.

Một lưu ý quan trọng với bản đồ giảm của MongoDB là thao tác giảm phải chấp nhận và xuất ra cùng một kiểu dữ liệu vì nó có thể được áp dụng nhiều lần cho một phần bộ dữ liệu được nhóm. Nếu bạn được thông qua một mảng các giá trị, không chỉ đơn giản là lấy chiều dài của nó bởi vì nó có thể là một phần kết quả từ một hoạt động giảm trước đó.

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