2015-06-03 12 views
9

Đây có thể là một vấn đề dễ dàng nhưng về cơ bản tôi có tập dữ liệu để đếm số lượng nữ cho mỗi quốc gia. Cuối cùng tôi muốn nhóm mỗi lần đếm theo quốc gia nhưng tôi không chắc chắn về những gì để sử dụng cho giá trị vì không có cột đếm trong tập dữ liệu mà tôi có thể sử dụng làm giá trị trong một nhómByKey hoặc reduceByKey. Tôi đã nghĩ đến việc sử dụng hàm reduceByKey() nhưng yêu cầu một cặp khóa-giá trị và tôi chỉ muốn đếm khóa và tạo một bộ đếm làm giá trị. Làm thế nào để tôi đi về điều này?Spark - Cách đếm số lượng bản ghi theo khóa

val lines = sc.textFile("/home/cloudera/desktop/file.txt") 
val split_lines = lines.map(_.split(",")) 
val femaleOnly = split_lines.filter(x => x._10 == "Female") 

Đây là nơi tôi bị kẹt. Quốc gia này cũng là chỉ số 13 trong tập dữ liệu. Kết quả đầu ra sẽ trông như sau: (Úc, 201000) (Mỹ, 420000) vv Bất kỳ trợ giúp nào đều tuyệt vời. Cảm ơn

+0

Có một lý do tại sao bạn không muốn (tạm thời) thêm một giá trị? Bạn về cơ bản có thể làm điều đó như đếm từ và làm cho tất cả các cặp KV của bạn một cái gì đó như sau đó reduceByKey và tổng hợp các giá trị. Hoặc tạo khóa <[female, australia], 1> rồi giảmByKey và tổng để nhận số lượng phụ nữ ở quốc gia được chỉ định. Tôi không chắc chắn làm thế nào để làm điều này với scala, nhưng với python + spark này là rất dễ dàng. – TravisJ

Trả lời

12

Bạn sắp hoàn tất! Tất cả bạn cần là một countByValue:

val countOfFemalesByCountry = femaleOnly.map(_(13)).countByValue() 
// Prints (Australia, 230), (America, 23242), etc. 

(Trong ví dụ của bạn, tôi giả sử bạn có nghĩa là x (10) chứ không phải là x._10)

tất cả với nhau:

sc.textFile("/home/cloudera/desktop/file.txt") 
    .map(_.split(",")) 
    .filter(x => x(10) == "Female") 
    .map(_(13)) 
    .countByValue() 
+0

đó là một câu trả lời tuyệt vời. Làm thế nào tôi có thể tính toán hashmap của một hashmap. Đó là tôi muốn có nhóm cho mỗi giới tính. Một cái gì đó như sc.textFile ("/ home/cloudera/desktop/file.txt") .map (_. Split (",")) .map (_ (10)) .map (_ (13)) .countByValue() – user1579557

0

Bạn có thể dễ dàng tạo khóa , không cần phải có trong tệp/cơ sở dữ liệu. Ví dụ:

val countryGender = sc.textFile("/home/cloudera/desktop/file.txt") 
       .map(_.split(",")) 
       .filter(x => x._10 == "Female") 
       .map(x => (x._13, x._10)) // <<<< here you generate a new key 
       .groupByKey(); 
+0

Bạn có thể hoàn thành công việc này với chức năng giảm để nhận số lượng hồ sơ theo quốc gia không? –

5

Bạn đã xem xét thao tác RDD của mình bằng cách sử dụng Dataframes API?

Có vẻ như bạn đang tải tệp CSV, bạn có thể thực hiện với spark-csv.

Sau đó, nó là một vấn đề đơn giản (nếu CSV của bạn có tiêu đề với các tên cột rõ ràng) của:

import com.databricks.spark.csv._ 

val countryGender = sqlContext.csvFile("/home/cloudera/desktop/file.txt") // already splits by field 
    .filter($"gender" === "Female") 
    .groupBy("country").count().show() 

Nếu bạn muốn đi sâu hơn trong loại thao tác, sau đây là hướng dẫn: https://spark.apache.org/docs/latest/sql-programming-guide.html

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