Mục lục
Giới thiệu
Spark:
Scala:
Chuẩn bị dữ liệu:
Xây dựng khung dữ liệu:
Chuyển đổi dữ liệu JSON trong RDD thành đối tượng và thực hiện một số thao tác làm sạch dữ liệu.
Đoạn mã này sử dụng phương thức reduceByKey để tổng hợp dữ liệu trong dateRdd, tính tổng lượng mưa tại cùng một vị trí và ngày. Phương thức reduceByKey hoạt động dựa trên khóa (tuples gồm vị trí và ngày), nó hợp nhất các phần tử có cùng khóa và áp dụng một hàm tổng hợp cụ thể cho giá trị tương ứng.
Đầu tiên, sử dụng phương thức filter để lọc dateRdd, chọn ra các dữ liệu có lượng mưa bằng không. _._2 đại diện cho phần tử thứ hai của tuple, tức là lượng mưa. _._2 == 0 có nghĩa là các dữ liệu có lượng mưa bằng không. Tiếp theo, sử dụng phương thức mapValues để chuyển đổi dữ liệu đã lọc thành cặp khóa-giá trị, và đặt giá trị cho mỗi khóa là 1. Ở đây sử dụng dấu _ để bỏ qua phần tử đầu tiên của tuple (vị trí và ngày), chỉ thao tác với giá trị. Cuối cùng, sử dụng phương thức reduceByKey để tổng hợp các khóa giống nhau, tính tổng giá trị tương ứng với mỗi khóa. Hàm tổng hợp vẫn là (a, b) => a + b, cộng các giá trị của cùng một khóa lại với nhau.
Sử dụng split() để chia ký tự với \, trong dateSplit(0) và dateSplit(1) dùng _ để phân tách.
Thống kê tổng lượng mưa và số ngày không mưa được ghi nhận tại mỗi trạm khí tượng hàng năm hàng tháng:
Giới thiệu
Spark:
Spark là một công cụ xử lý và phân tích dữ liệu lớn nhanh chóng và đa năng. Nó được phát triển ban đầu bởi Đại học California, Berkeley, là một dự án mã nguồn mở, nhằm cung cấp một công cụ hiệu suất cao, dễ sử dụng cho việc xử lý và phân tích các khối lượng dữ liệu lớn.
Spark hỗ trợ nhiều ngôn ngữ lập trình bao gồm Scala, Java, Python và R, điều này cho phép các nhà phát triển sử dụng ngôn ngữ quen thuộc để thực hiện các tác vụ xử lý và phân tích dữ liệu quy mô lớn.
Một đặc điểm chính của Spark là hiệu suất nhanh. Nó tận dụng tối đa tính toán trong bộ nhớ, lưu trữ dữ liệu trong RAM để tránh các điểm nghẽn của đọc ghi đĩa, từ đó tăng tốc độ xử lý đáng kể. Spark còn sử dụng khái niệm tập dữ liệu phân tắc linh hoạt (RDD), cho phép xử lý dữ liệu song song trên các nút khác nhau,进一步提高处理性能.
Ngoài việc xử lý và phân tích dữ liệu lớn, Spark còn cung cấp một số tính năng nâng cao như xử lý luồng, học máy và xử lý đồ thị, làm cho nó trở thành một nền tảng xử lý và phân tích dữ liệu lớn mạnh mẽ và toàn diện.
Scala:
Scala cũng là một ngôn ngữ hàm, trong đó các hàm cũng có thể được coi như các giá trị. Scala cung cấp cú pháp nhẹ để định nghĩa các hàm ẩn danh, hỗ trợ hàm bậc cao, cho phép lồng nhiều tầng hàm, và hỗ trợ currying. Các case class và pattern matching tích hợp trong Scala tương đương với các kiểu đại số thường được sử dụng trong ngôn ngữ lập trình hàm.
Hơn nữa, lập trình viên có thể sử dụng pattern matching của Scala để viết các mã xử lý dữ liệu XML tương tự như biểu thức chính quy.
Chuẩn bị dữ liệu:
Xây dựng khung dữ liệu:
package com.cjy.weather
class Thoitiet(var ngay: String, //ngày
var vi_tri: String, //tên trạm thời tiết
var nhietthapnhat: String, //nhiệt độ thấp nhất
var nhietcao_nhat: String, //nhiệt độ cao nhất
var luommua: String, //lượng mưa ghi nhận trong ngày (mm)
var huonggio_giopy: String, //hướng gió mạnh nhất từ 24 giờ đến nửa đêm
var tocdo_giopy: String, //tốc độ gió mạnh nhất trong 24 giờ đến nửa đêm (km/h)
var huonggio_9sang: String, //hướng gió lúc 9 giờ sáng
var huonggio_3chieu: String, //hướng gió lúc 3 giờ chiều
var tocdo_gio_9sang: String, //tốc độ gió trung bình trong 10 phút trước 9 giờ sáng
var tocdo_gio_3chieu: String, //tốc độ gió trung bình trong 10 phút trước 3 giờ chiều
var doam_9sang: String, //độ ẩm lúc 9 giờ sáng (%)
var doam_3chieu: String, //độ ẩm lúc 3 giờ chiều (%)
var apsuat_9sang: String, //áp suất khí quyển lúc 9 giờ sáng (hpa) quy về mực nước biển trung bình
var apsuat_3chieu: String, //áp suất khí quyển lúc 3 giờ chiều (hpa) quy về mực nước biển trung bình
var mây_3chieu: String, //tỷ lệ bầu trời bị che phủ bởi mây lúc 3 giờ chiều. Đơn vị là "oktas"
var nhiet_9sang: String, //nhiệt độ lúc 9 giờ sáng (°C)
var nhiet_3chieu: String, //nhiệt độ lúc 3 giờ chiều (°C)
var mua_homnay: String, //nếu lượng mưa từ 24 giờ đến 9 giờ sáng (mm) vượt quá 1mm thì là YES, ngược lại là NO
var mua_ngaymai: String //lượng mưa ngày mai, tính bằng mm. Một cách đo lường "rủi ro". Nếu có mưa ngày mai thì YES, ngược lại là NO
)extends Serializable{
}
Chuyển đổi dữ liệu JSON trong RDD thành đối tượng và thực hiện một số thao tác làm sạch dữ liệu.
var duLieuNgay = duLieu.map(it=> new Gson().fromJson(it,classOf[Thoitiet]))
.filter(thoitiet=> !thoitiet.luommua.equals("NA"))
.map(thoitiet => ((thoitiet.vi_tri,chuyenDoi(thoitiet.ngay)),thoitiet.luommua.toDouble))