Truy vấn tập tin sàn gỗ python

Pyspark SQL cung cấp các phương thức để đọc tệp Parquet vào DataFrame và ghi DataFrame vào tệp Parquet, hàm


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
4 từ

data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
5 và

data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
6 được sử dụng để đọc và ghi/tạo tệp Parquet tương ứng. Các tệp sàn gỗ duy trì lược đồ cùng với dữ liệu do đó nó được sử dụng để xử lý tệp có cấu trúc

Trong bài viết này, tôi sẽ giải thích cách đọc và ghi tệp sàn gỗ, đồng thời giải thích cách phân vùng dữ liệu và truy xuất dữ liệu được phân vùng với sự trợ giúp của SQL

Dưới đây là các câu lệnh đơn giản về cách viết và đọc tệp sàn gỗ trong PySpark mà tôi sẽ giải thích chi tiết trong các phần sau


df.write.parquet("/tmp/out/people.parquet") 
parDF1=spark.read.parquet("/temp/out/people.parquet")

Trước đây, tôi đã giải thích chi tiết, trước tiên hãy hiểu Tệp Parquet là gì và những ưu điểm của nó so với CSV, JSON và các định dạng tệp văn bản khác

Tập tin sàn gỗ là gì?

Tệp Apache Parquet là định dạng lưu trữ dạng cột có sẵn cho bất kỳ dự án nào trong hệ sinh thái Hadoop, bất kể lựa chọn khung xử lý dữ liệu, mô hình dữ liệu hay ngôn ngữ lập trình

Thuận lợi

Trong khi truy vấn lưu trữ dạng cột, nó sẽ bỏ qua dữ liệu không liên quan rất nhanh, giúp thực hiện truy vấn nhanh hơn. Kết quả là các truy vấn tổng hợp tiêu tốn ít thời gian hơn so với cơ sở dữ liệu hướng hàng

Nó có thể hỗ trợ các cấu trúc dữ liệu lồng nhau nâng cao

Sàn gỗ hỗ trợ các tùy chọn nén và lược đồ mã hóa hiệu quả

Pyspark SQL cung cấp hỗ trợ cho cả đọc và ghi các tệp Parquet tự động ghi lại lược đồ của dữ liệu gốc, Nó cũng giảm trung bình 75% dung lượng lưu trữ dữ liệu. Pyspark theo mặc định hỗ trợ Parquet trong thư viện của nó, do đó chúng tôi không cần thêm bất kỳ thư viện phụ thuộc nào

Ví dụ Pyspark sàn gỗ Apache

Vì chúng tôi không có tệp sàn gỗ, hãy làm việc với việc viết sàn gỗ từ DataFrame. Đầu tiên, tạo Khung dữ liệu Pyspark từ danh sách dữ liệu bằng phương pháp


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
7


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)

ví dụ trên, nó tạo một DataFrame với các cột tên, tên đệm, họ, dob, giới tính, tiền lương

Pyspark Ghi DataFrame sang định dạng tệp Parquet

Bây giờ, hãy tạo một tệp sàn gỗ từ PySpark DataFrame bằng cách gọi hàm


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
4 của lớp

data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
6. Khi bạn ghi một DataFrame vào tệp lát gỗ, nó sẽ tự động giữ nguyên tên cột và kiểu dữ liệu của chúng. Mỗi tệp phần mà Pyspark tạo có. phần mở rộng tập tin sàn gỗ. Dưới đây là ví dụ,


df.write.parquet("/tmp/output/people.parquet")
Truy vấn tập tin sàn gỗ python

Pyspark Đọc tệp Parquet vào DataFrame

Pyspark cung cấp một phương thức


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
4 trong lớp

data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
5 để đọc tệp sàn gỗ vào khung dữ liệu. Dưới đây là một ví dụ về việc đọc tệp sàn gỗ vào khung dữ liệu


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
1

Nối hoặc ghi đè tệp Parquet hiện có

Sử dụng chế độ lưu nối thêm, bạn có thể nối thêm khung dữ liệu vào tệp sàn gỗ hiện có. Trong trường hợp ghi đè lên, hãy sử dụng chế độ lưu ghi đè


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
2

Thực thi truy vấn SQL DataFrame

Pyspark Sql cung cấp để tạo các chế độ xem tạm thời trên các tệp sàn gỗ để thực hiện các truy vấn sql. Các chế độ xem này khả dụng cho đến khi chương trình của bạn tồn tại


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
3

Tạo bảng trên tệp Parquet

Bây giờ, hãy xem qua việc thực thi các truy vấn SQL trên tệp sàn gỗ. Để thực hiện các truy vấn sql, hãy tạo một chế độ xem hoặc bảng tạm thời trực tiếp trên tệp sàn gỗ thay vì tạo từ DataFrame


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
4

Ở đây, chúng tôi đã tạo chế độ xem tạm thời


df.write.parquet("/tmp/output/people.parquet")
2 từ tệp “

df.write.parquet("/tmp/output/people.parquet")
3”. Điều này mang lại kết quả sau


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
7

Tạo tập tin phân vùng Parquet

Khi chúng tôi thực hiện một truy vấn cụ thể trên bảng PERSON, nó sẽ quét qua tất cả các hàng và trả lại kết quả. Điều này tương tự như việc thực hiện truy vấn cơ sở dữ liệu truyền thống. Trong PySpark, chúng tôi có thể cải thiện việc thực thi truy vấn theo cách được tối ưu hóa bằng cách thực hiện các phân vùng trên dữ liệu bằng phương pháp pyspark


df.write.parquet("/tmp/output/people.parquet")
4. Sau đây là ví dụ về partitionBy()


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
9

Khi bạn kiểm tra người2. tệp sàn gỗ, nó có hai phân vùng "giới tính" theo sau là "lương" bên trong

Truy vấn tập tin sàn gỗ python

Truy xuất từ ​​tệp Parquet được phân vùng

Ví dụ dưới đây giải thích về việc đọc tệp sàn gỗ được phân vùng vào DataFrame với giới tính=M


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
0

Đầu ra cho ví dụ trên được hiển thị bên dưới


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
0

Tạo một bảng trên tệp Parquet được phân vùng

Ở đây, tôi đang tạo một bảng trên tệp sàn gỗ được phân vùng và thực hiện một truy vấn thực thi nhanh hơn bảng không có phân vùng, do đó cải thiện hiệu suất


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
1

Dưới đây là đầu ra


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
2

Ví dụ hoàn chỉnh về PySpark đọc và ghi tệp Parquet


data =[("James ","","Smith","36636","M",3000),
              ("Michael ","Rose","","40288","M",4000),
              ("Robert ","","Williams","42114","M",4000),
              ("Maria ","Anne","Jones","39192","F",4000),
              ("Jen","Mary","Brown","","F",-1)]
columns=["firstname","middlename","lastname","dob","gender","salary"]
df=spark.createDataFrame(data,columns)
3

Phần kết luận

Chúng tôi đã học cách viết tệp Sàn gỗ từ Khung dữ liệu PySpark và đọc tệp sàn gỗ vào DataFrame và tạo chế độ xem/bảng để thực hiện các truy vấn SQL. Cũng giải thích cách thực hiện phân vùng trên tệp sàn gỗ để cải thiện hiệu suất