Spark SQL - DataFrames

DataFrame là một tập hợp dữ liệu phân tán, được tổ chức thành các cột được đặt tên. Về mặt khái niệm, nó tương đương với các bảng quan hệ có kỹ thuật tối ưu hóa tốt.

Một DataFrame có thể được xây dựng từ một loạt các nguồn khác nhau như bảng Hive, tệp Dữ liệu có cấu trúc, cơ sở dữ liệu bên ngoài hoặc RDD hiện có. API này được thiết kế cho các ứng dụng Khoa học dữ liệu và Dữ liệu lớn hiện đại, lấy cảm hứng từDataFrame in R ProgrammingPandas in Python.

Các tính năng của DataFrame

Dưới đây là một số tính năng đặc trưng của DataFrame:

  • Khả năng xử lý dữ liệu có kích thước từ Kilobyte đến Petabyte trên một cụm nút đơn đến cụm lớn.

  • Hỗ trợ các định dạng dữ liệu khác nhau (Avro, csv, tìm kiếm đàn hồi và Cassandra) và hệ thống lưu trữ (HDFS, bảng HIVE, mysql, v.v.).

  • Tối ưu hóa hiện đại và tạo mã thông qua trình tối ưu hóa Spark SQL Catalyst (khung chuyển đổi cây).

  • Có thể dễ dàng tích hợp với tất cả các công cụ và khuôn khổ Dữ liệu lớn thông qua Spark-Core.

  • Cung cấp API cho Lập trình Python, Java, Scala và R.

SQLContext

SQLContext là một lớp và được sử dụng để khởi tạo các chức năng của Spark SQL. Đối tượng lớp SparkContext (sc) là bắt buộc để khởi tạo đối tượng lớp SQLContext.

Lệnh sau được sử dụng để khởi tạo SparkContext thông qua spark-shell.

$ spark-shell

Theo mặc định, đối tượng SparkContext được khởi tạo với tên sc khi vỏ tia lửa bắt đầu.

Sử dụng lệnh sau để tạo SQLContext.

scala> val sqlcontext = new org.apache.spark.sql.SQLContext(sc)

Thí dụ

Chúng ta hãy xem xét một ví dụ về hồ sơ nhân viên trong tệp JSON có tên employee.json. Sử dụng các lệnh sau để tạo DataFrame (df) và đọc tài liệu JSON có tênemployee.json với nội dung sau.

employee.json - Đặt tập tin này trong thư mục hiện tại scala> con trỏ được định vị.

{
   {"id" : "1201", "name" : "satish", "age" : "25"}
   {"id" : "1202", "name" : "krishna", "age" : "28"}
   {"id" : "1203", "name" : "amith", "age" : "39"}
   {"id" : "1204", "name" : "javed", "age" : "23"}
   {"id" : "1205", "name" : "prudvi", "age" : "23"}
}

Hoạt động DataFrame

DataFrame cung cấp một ngôn ngữ dành riêng cho miền để thao tác dữ liệu có cấu trúc. Ở đây, chúng tôi bao gồm một số ví dụ cơ bản về xử lý dữ liệu có cấu trúc bằng DataFrames.

Làm theo các bước dưới đây để thực hiện các hoạt động DataFrame -

Đọc tài liệu JSON

Đầu tiên, chúng ta phải đọc tài liệu JSON. Dựa trên điều này, tạo một DataFrame có tên (dfs).

Sử dụng lệnh sau để đọc tài liệu JSON có tên employee.json. Dữ liệu được hiển thị dưới dạng bảng với các trường - id, tên và tuổi.

scala> val dfs = sqlContext.read.json("employee.json")

Output - Tên trường được lấy tự động từ employee.json.

dfs: org.apache.spark.sql.DataFrame = [age: string, id: string, name: string]

Hiển thị dữ liệu

Nếu bạn muốn xem dữ liệu trong DataFrame, hãy sử dụng lệnh sau.

scala> dfs.show()

Output - Bạn có thể xem dữ liệu nhân viên ở định dạng bảng.

<console>:22, took 0.052610 s
+----+------+--------+
|age | id   |  name  |
+----+------+--------+
| 25 | 1201 | satish |
| 28 | 1202 | krishna|
| 39 | 1203 | amith  |
| 23 | 1204 | javed  |
| 23 | 1205 | prudvi |
+----+------+--------+

Sử dụng phương pháp printSchema

Nếu bạn muốn xem Cấu trúc (Lược đồ) của DataFrame, hãy sử dụng lệnh sau.

scala> dfs.printSchema()

Output

root
   |-- age: string (nullable = true)
   |-- id: string (nullable = true)
   |-- name: string (nullable = true)

Sử dụng phương pháp chọn

Sử dụng lệnh sau để tìm nạp name-cột trong số ba cột từ DataFrame.

scala> dfs.select("name").show()

Output - Bạn có thể thấy các giá trị của name cột.

<console>:22, took 0.044023 s
+--------+
|  name  |
+--------+
| satish |
| krishna|
| amith  |
| javed  |
| prudvi |
+--------+

Sử dụng bộ lọc độ tuổi

Sử dụng lệnh sau để tìm nhân viên có tuổi lớn hơn 23 (tuổi> 23).

scala> dfs.filter(dfs("age") > 23).show()

Output

<console>:22, took 0.078670 s
+----+------+--------+
|age | id   | name   |
+----+------+--------+
| 25 | 1201 | satish |
| 28 | 1202 | krishna|
| 39 | 1203 | amith  |
+----+------+--------+

Sử dụng phương pháp groupBy

Sử dụng lệnh sau để đếm số lượng nhân viên ở cùng độ tuổi.

scala> dfs.groupBy("age").count().show()

Output - hai nhân viên 23 tuổi.

<console>:22, took 5.196091 s
+----+-----+
|age |count|
+----+-----+
| 23 |  2  |
| 25 |  1  |
| 28 |  1  |
| 39 |  1  |
+----+-----+

Chạy truy vấn SQL theo lập trình

Một SQLContext cho phép các ứng dụng chạy các truy vấn SQL theo chương trình trong khi chạy các hàm SQL và trả về kết quả dưới dạng DataFrame.

Nói chung, ở chế độ nền, SparkSQL hỗ trợ hai phương pháp khác nhau để chuyển đổi các RDD hiện có thành DataFrames -

Sơ không Phương pháp & Mô tả
1 Suy ra lược đồ bằng cách sử dụng Phản chiếu

Phương pháp này sử dụng sự phản chiếu để tạo ra lược đồ của một RDD có chứa các loại đối tượng cụ thể.

2 Chỉ định lược đồ theo chương trình

Phương pháp thứ hai để tạo DataFrame là thông qua giao diện lập trình cho phép bạn tạo một lược đồ và sau đó áp dụng nó cho RDD hiện có.