Tôi có thể sử dụng Python trong Spark không?

PySparkQuay lại bảng thuật ngữ

Dùng thử Databricks miễn phí

PySpark là gì?

Apache Spark được viết bằng ngôn ngữ lập trình Scala. PySpark đã được phát hành để hỗ trợ sự cộng tác của Apache Spark và Python, nó thực sự là API Python cho Spark. Ngoài ra, PySpark, giúp bạn giao tiếp với Bộ dữ liệu phân tán đàn hồi (RDD) bằng ngôn ngữ lập trình Apache Spark và Python. Điều này đã đạt được bằng cách tận dụng thư viện Py4j.
Tôi có thể sử dụng Python trong Spark không?
Py4J là một thư viện phổ biến được tích hợp trong PySpark và cho phép python giao tiếp động với các đối tượng JVM. PySpark có khá nhiều thư viện để viết các chương trình hiệu quả. Hơn nữa, có nhiều thư viện bên ngoài cũng tương thích. Dưới đây là một số trong số họ

Tia lửa SQL

Thư viện PySpark để áp dụng phân tích giống như SQL trên một lượng lớn dữ liệu có cấu trúc hoặc bán cấu trúc. Chúng tôi cũng có thể sử dụng các truy vấn SQL với Spark SQL. Nó cũng có thể được kết nối với Apache Hive. HiveQL cũng có thể được áp dụng. PySparkSQL là một trình bao bọc trên lõi PySpark. PySparkSQL đã giới thiệu DataFrame, một biểu diễn dạng bảng của dữ liệu có cấu trúc tương tự như bảng từ hệ thống quản lý cơ sở dữ liệu quan hệ

MLlib

MLlib là một trình bao bọc trên PySpark và nó là thư viện máy học (ML) của Spark. Thư viện này sử dụng kỹ thuật xử lý song song dữ liệu để lưu trữ và làm việc với dữ liệu. API học máy do thư viện MLlib cung cấp khá dễ sử dụng. MLlib hỗ trợ nhiều thuật toán học máy để phân loại, hồi quy, phân cụm, lọc cộng tác, giảm kích thước và các nguyên tắc tối ưu hóa cơ bản

khung đồ thị

GraphFrames là một thư viện xử lý biểu đồ có mục đích cung cấp một bộ API để thực hiện phân tích biểu đồ một cách hiệu quả, sử dụng lõi PySpark và PySparkSQL. Nó được tối ưu hóa cho tính toán phân tán nhanh. Ưu điểm của việc sử dụng PySpark. • Python rất dễ học và triển khai. • Nó cung cấp API đơn giản và toàn diện. • Với Python, khả năng đọc mã, bảo trì và mức độ quen thuộc tốt hơn nhiều. • Nó có các tùy chọn khác nhau để trực quan hóa dữ liệu, điều khó sử dụng Scala hoặc Java.  

Tài nguyên bổ sung

  • Bắt đầu với Python trên Apache Spark
  • Đạt được hiệu suất tốt nhất với PySpark
  • Từ Python đến PySpark và ngược lại – Hợp nhất Máy chủ đơn và Học sâu phân tán với Maggy
  • Dân chủ hóa PySpark để xuất bản trò chơi di động

Quay lại bảng thuật ngữ

Nếu bạn giống tôi, bạn đã nghe nói về một công nghệ nghe có vẻ lạ mắt có tên là Spark và muốn kiểm tra dũng khí viết mã của mình để xem liệu bạn có thể thêm một công cụ khác vào bộ công cụ khoa học dữ liệu của mình không. Hy vọng rằng bạn không hoàn toàn giống tôi vì trong trường hợp của tôi, tôi đã nhanh chóng đụng phải bức tường cài đặt, rồi bức tường thuật ngữ, rồi bức tường khái niệm, và bốn giờ sau, tôi đã không viết được một dòng mã nào. Và vì vậy, sau nhiều giờ lùng sục trên mạng và nhiều thứ được gọi là “hướng dẫn cho người mới bắt đầu” mà tôi không muốn đề cập đến, tôi quyết định viết một “hướng dẫn của người Neanderthal” để hy vọng giúp bạn tránh khỏi những rắc rối mà tôi đã phải chịu đựng

Tại sao nên đọc Hướng dẫn này?

Ngay cả khi tìm kiếm nhanh trực tuyến các tài liệu học tập trên Spark cũng sẽ khiến bạn ngập trong tài liệu, các khóa học trực tuyến (nhiều trong số đó không hề rẻ) và một loạt các tài nguyên khác. Theo kinh nghiệm của tôi, phần lớn trong số này cho rằng tôi biết quá nhiều về điện toán phân tán (chẳng hạn như giả sử tôi biết điện toán phân tán có nghĩa là gì) hoặc họ cung cấp thông tin cơ bản hoặc cấp cao mà không giúp tôi hiểu cách thực sự triển khai bất kỳ thứ gì trong Spark

Với ý nghĩ đó, trong hướng dẫn này, tôi cố gắng hết sức để giải thích một khái niệm hoặc hướng dẫn bạn đến một nơi khác bằng một lời giải thích, tất cả đều nhằm mục đích giúp bạn viết mã Spark nhanh nhất có thể. Bởi vì tôi cố gắng làm điều này cho càng nhiều chủ đề liên quan đến Spark càng tốt, vui lòng tham khảo nếu bạn đã nắm vững một chủ đề cụ thể. Tôi cũng sẽ cố gắng để lại cho bạn các liên kết đến các tài nguyên mà tôi thấy hữu ích khi tìm hiểu về Spark

Đây là cấu trúc của hướng dẫn. Tôi bắt đầu bằng cách giải thích một số thuật ngữ và khái niệm chính để chúng ta có thể thống nhất với phần còn lại của tài liệu và cũng để hạ thấp rào cản truy cập vào các tài nguyên bên ngoài trên Spark mà bạn sẽ tìm thấy ở đây và các nơi khác. Tiếp theo, tôi hướng dẫn cách tải phiên bản Spark đang hoạt động trên máy của bạn bằng Google Colab. Và cuối cùng, tôi xem xét một trường hợp sử dụng để chứng minh cách PySpark thực sự được triển khai và lần đầu tiên vượt qua một vấn đề ví dụ trông như thế nào

Bạn sẽ học được gì

  • Đủ thuật ngữ và khái niệm để có thể đọc các tài nguyên Spark khác mà không bị nhầm lẫn vĩnh viễn
  • Một cách tương đối dễ dàng để chạy PySpark trên máy tính của bạn
  • Cách bắt đầu khám phá dữ liệu trong PySpark
  • Xây dựng và đánh giá mô hình hồi quy tuyến tính cơ bản trong PySpark
  • Tài nguyên bên ngoài hữu ích cho phần lớn tài liệu được trình bày ở đây

Thuật ngữ và khái niệm chính

Dưới đây là danh sách các thuật ngữ và khái niệm khác nhau sẽ hữu ích khi bạn tìm hiểu sâu về thế giới Spark

tia lửa là gì

Nếu bạn đã tìm kiếm "Spark là gì" trên Google, thì có khả năng bạn gặp phải mô tả sau đây hoặc đại loại như vậy. “Spark là một công cụ xử lý dữ liệu phân tán có mục đích chung”. Không có nền tảng về Spark hoặc bất kỳ sự quen thuộc nào với ý nghĩa của các thuật ngữ đó, định nghĩa đó khá vô ích. Vì vậy, hãy phá vỡ nó

  • Dữ liệu phân tán/Điện toán phân tán — Apache Spark hoạt động trong một thế giới hơi khác so với khoa học máy tính thông thường. Khi bộ dữ liệu trở nên quá lớn hoặc khi dữ liệu mới đến quá nhanh, nó có thể trở nên quá nhiều đối với một máy tính để xử lý. Đây là nơi điện toán phân tán xuất hiện. Thay vì cố gắng xử lý một tập dữ liệu khổng lồ hoặc chạy các chương trình siêu tốn kém về mặt tính toán trên một máy tính, các tác vụ này có thể được phân chia giữa nhiều máy tính giao tiếp với nhau để tạo ra kết quả đầu ra. Công nghệ này có một số lợi ích nghiêm trọng, nhưng việc phân bổ các tác vụ xử lý trên nhiều máy tính có những thách thức riêng và không thể được cấu trúc giống như cách xử lý thông thường. Khi Spark nói rằng nó liên quan đến dữ liệu phân tán, điều này có nghĩa là nó được thiết kế để xử lý các tập dữ liệu rất lớn và xử lý chúng trên một hệ thống máy tính phân tán

GHI CHÚ. Trong một hệ thống máy tính phân tán, mỗi máy tính riêng lẻ được gọi là một nút và tập hợp tất cả chúng được gọi là một cụm

(Truyện từ xkcd)

Đọc thêm - Giới thiệu về điện toán phân tán (đọc 8 phút)

  • Công cụ xử lý/Khung xử lý — Một công cụ xử lý, đôi khi được gọi là khung xử lý, chịu trách nhiệm thực hiện các tác vụ xử lý dữ liệu (tôi biết một lời giải thích rõ ràng). Một so sánh có lẽ là cách tốt nhất để hiểu điều này. Apache Hadoop là một nền tảng phần mềm nguồn mở cũng xử lý “Dữ liệu lớn” và tính toán phân tán. Hadoop có một công cụ xử lý, khác với Spark, được gọi là MapReduce. MapReduce có cách riêng để tối ưu hóa các tác vụ được xử lý trên nhiều nút và Spark có cách khác. Một trong những điểm mạnh của Sparks là nó là một công cụ xử lý có thể được sử dụng riêng hoặc được sử dụng thay cho Hadoop MapReduce, tận dụng các tính năng khác của Hadoop

(Hình ảnh từ Brad Anderson)

Đọc thêm — Công cụ xử lý được giải thích và so sánh (~10 phút đọc)

  • Mục đích chung - Một trong những ưu điểm chính của Spark là mức độ linh hoạt của nó và số lượng miền ứng dụng mà nó có. Nó hỗ trợ Scala, Python, Java, R và SQL. Nó có một mô-đun SQL chuyên dụng, nó có thể xử lý dữ liệu được truyền trực tuyến trong thời gian thực và nó có cả thư viện máy học và công cụ tính toán biểu đồ được xây dựng trên nó. Tất cả những lý do này góp phần giải thích tại sao Spark trở thành một trong những công cụ xử lý phổ biến nhất trong lĩnh vực Dữ liệu lớn

Chức năng Spark (từ Databricks. com)

Đọc thêm - Hướng dẫn 5 phút để hiểu tầm quan trọng của Spark (có thể giống như ~ 10 phút đọc)

Thuật ngữ điện toán phân tán

  • Dữ liệu được phân vùng - Khi làm việc với một cụm máy tính, bạn không thể ném vào một khung dữ liệu vanilla và mong đợi nó biết phải làm gì. Vì các tác vụ xử lý sẽ được chia cho nhiều nút nên dữ liệu cũng phải được chia cho nhiều nút. Dữ liệu được phân vùng đề cập đến dữ liệu đã được tối ưu hóa để có thể được xử lý trên nhiều nút

Đọc thêm - Giải thích về phân vùng dữ liệu (đọc 2 phút)

  • Khả năng chịu lỗi - Nói tóm lại, khả năng chịu lỗi đề cập đến khả năng tiếp tục hoạt động bình thường của hệ thống phân tán ngay cả khi xảy ra lỗi. Ví dụ, một lỗi có thể là một nút bùng cháy hoặc chỉ là sự cố liên lạc giữa các nút. Khả năng chịu lỗi trong Spark xoay quanh RDD của Spark (sẽ được thảo luận sau). Về cơ bản, cách xử lý lưu trữ dữ liệu trong Spark cho phép các chương trình Spark hoạt động bình thường mặc dù xảy ra lỗi

Đọc thêm - Khả năng chịu lỗi của Spark như thế nào (~1 phút đọc)

  • Đánh giá lười biếng - Đánh giá lười biếng, hoặc tính toán lười biếng, liên quan đến cách mã được biên dịch. Khi một trình biên dịch không lười biếng (được gọi là đánh giá nghiêm ngặt) biên dịch mã, nó sẽ tuần tự đánh giá từng biểu thức mà nó gặp phải. Mặt khác, một trình biên dịch lười biếng không liên tục đánh giá các biểu thức mà thay vào đó, đợi cho đến khi nó thực sự được yêu cầu tạo ra một kết quả, sau đó thực hiện tất cả các đánh giá cùng một lúc. Vì vậy, khi biên dịch mã, nó theo dõi mọi thứ mà cuối cùng nó sẽ phải đánh giá (trong Spark loại nhật ký đánh giá này, có thể nói, được gọi là biểu đồ dòng dõi), và sau đó bất cứ khi nào nó được nhắc trả lại thứ gì đó, nó sẽ thực hiện đánh giá . Điều này rất hữu ích vì nó làm cho các chương trình hiệu quả hơn vì trình biên dịch không phải đánh giá bất kỳ thứ gì không thực sự được sử dụng

Đọc thêm - Đánh giá lười biếng là gì (đọc 4 phút)

điều khoản tia lửa

  • RDD, Khung dữ liệu, Bộ dữ liệu, Oh My. — Spark RDD (Bộ dữ liệu phân tán đàn hồi) là cấu trúc dữ liệu là khối xây dựng cốt lõi của Spark. RDD là một tập hợp các bản ghi được phân vùng, không thay đổi, có nghĩa là nó có thể chứa các giá trị, bộ dữ liệu hoặc các đối tượng khác, các bản ghi này được phân vùng để được xử lý trên một hệ thống phân tán và một khi RDD đã được tạo, nó sẽ được . Điều đó về cơ bản tổng hợp từ viết tắt của nó. chúng có khả năng phục hồi do tính bất biến và biểu đồ dòng dõi (sẽ được thảo luận ngay sau đây), chúng có thể được phân phối do các phân vùng của chúng và chúng là bộ dữ liệu vì chúng chứa dữ liệu
    Một điều quan trọng cần lưu ý là RDD không có lược đồ, điều đó có nghĩa là chúng không có cấu trúc cột. Các bản ghi chỉ được ghi theo từng hàng và được hiển thị tương tự như một danh sách. Nhập Spark DataFrames. Đừng nhầm lẫn với Pandas DataFrames, vì chúng khác biệt, Spark DataFrame có tất cả các tính năng của RDD nhưng cũng có lược đồ. Điều này sẽ biến chúng thành cấu trúc dữ liệu mà chúng tôi lựa chọn để bắt đầu với PySpark
    Spark có một cấu trúc dữ liệu khác, Spark DataSets. Chúng tương tự như DataFrames nhưng được nhập mạnh, nghĩa là loại được chỉ định khi tạo Bộ dữ liệu và không được suy ra từ loại bản ghi được lưu trữ trong đó. Điều này có nghĩa là Bộ dữ liệu không được sử dụng trong PySpark vì Python là ngôn ngữ được nhập động
    Đối với phần còn lại của những giải thích này, tôi sẽ đề cập đến RDD nhưng biết rằng điều gì đúng với RDD cũng đúng với DataFrame, DataFrames chỉ được tổ chức thành cấu trúc cột

Đọc thêm - So sánh RDD, DataFrames và DataSets (~5 phút đọc)
Đọc thêm — Pandas v. Spark DataFrames (đọc 4 phút)
Đọc thêm — Tài liệu RDD hữu ích (~5 phút đọc)

  • Chuyển đổi - Chuyển đổi là một trong những điều bạn có thể làm với RDD trong Spark. Chúng là các hoạt động lười biếng tạo ra một hoặc nhiều RDD mới. Điều quan trọng cần lưu ý là Chuyển đổi tạo RDD mới bởi vì hãy nhớ rằng RDD là bất biến nên không thể thay đổi chúng theo bất kỳ cách nào sau khi chúng được tạo. Vì vậy, về bản chất, Chuyển đổi lấy RDD làm đầu vào và thực hiện một số chức năng trên chúng dựa trên những gì Chuyển đổi đang được gọi và xuất ra một hoặc nhiều RDD. Nhắc lại phần về đánh giá lười biếng, vì một trình biên dịch đi qua từng Chuyển đổi, nó không thực sự xây dựng bất kỳ RDD mới nào, mà xây dựng một chuỗi các RDD giả định sẽ là kết quả của các Chuyển đổi đó sẽ chỉ được đánh giá sau khi một Hành động được gọi. Chuỗi các RDD giả định hoặc “con” này, tất cả đều được kết nối một cách logic trở lại RDD “cha” ban đầu, chính là biểu đồ dòng dõi.

Đọc thêm — Tài liệu chuyển đổi hữu ích (~2 phút đọc) Đọc thêm — Tài liệu chuyên sâu hơn (đọc 5–10 phút; Chuyển đổi trong nửa đầu)

  • Hành động — Hành động là bất kỳ hoạt động RDD nào không tạo ra RDD làm đầu ra. Một số ví dụ về các Hành động phổ biến đang đếm dữ liệu hoặc tìm giá trị lớn nhất hoặc nhỏ nhất hoặc trả về phần tử đầu tiên của RDD, v.v. Như đã đề cập trước đây, một Hành động là gợi ý để trình biên dịch đánh giá biểu đồ dòng và trả về giá trị được chỉ định bởi Hành động

Đọc thêm — Tài liệu hành động hữu ích (~1 phút đọc)
Đọc thêm — Tài liệu chuyên sâu hơn (~5 phút đọc; Hành động trong nửa sau)

  • Biểu đồ dòng dõi — Hầu hết nội dung của biểu đồ dòng dõi đã được mô tả trong phần Biến đổi và Hành động, nhưng để tóm tắt, một biểu đồ dòng dõi phác thảo cái được gọi là “kế hoạch thực hiện hợp lý”. Điều đó có nghĩa là trình biên dịch bắt đầu với các RDD sớm nhất không phụ thuộc vào bất kỳ RDD nào khác và tuân theo một chuỗi Biến đổi logic cho đến khi kết thúc với RDD mà một Hành động được gọi. Tính năng này chủ yếu thúc đẩy khả năng chịu lỗi của Spark. Nếu một nút bị lỗi vì một số lý do, tất cả thông tin về những gì nút đó được cho là đang làm sẽ được lưu trữ trong biểu đồ dòng dõi, có thể được sao chép ở nơi khác

Trực quan hóa biểu đồ dòng dõi ví dụ;

Đọc thêm — (~2 phút đọc)

  • Ứng dụng và công việc Spark - Có rất nhiều điều khó hiểu khi nói về cách một công cụ xử lý như Spark thực sự thực thi các tác vụ xử lý trên một hệ thống phân tán. Phần sau đây chỉ là những gì bạn cần biết để hiểu rõ về tác dụng của một số đoạn mã Spark nhất định. Trong Spark, khi một hạng mục xử lý phải được thực hiện, sẽ có một quy trình “trình điều khiển” phụ trách lấy mã của người dùng và chuyển mã đó thành một tập hợp nhiều tác vụ. Ngoài ra còn có các quy trình "người thực thi", mỗi quy trình hoạt động trên một nút riêng biệt trong cụm, chịu trách nhiệm chạy các tác vụ, theo sự ủy quyền của trình điều khiển. Mỗi quy trình trình điều khiển có một tập hợp các trình thực thi mà nó có quyền truy cập để chạy các tác vụ. Ứng dụng Spark là một chương trình do người dùng tạo bao gồm trình điều khiển và trình điều khiển được liên kết với trình điều khiển đó. Công việc Spark là tác vụ hoặc tập hợp các tác vụ sẽ được thực thi với các quy trình thực thi, theo chỉ dẫn của trình điều khiển. Một công việc được kích hoạt bằng cách gọi một Hành động RDD. Nội dung này có thể khá khó hiểu, vì vậy đừng lo lắng nếu ban đầu nó không có ý nghĩa gì cả, sẽ rất hữu ích nếu bạn làm quen với các thuật ngữ này khi chúng được triển khai trong mã sau này. Tôi đã bao gồm các tài nguyên bổ sung về chủ đề này nếu bạn muốn biết thêm thông tin

Trực quan hóa Kiến trúc Spark (từ Spark API)

Đọc thêm - Tổng quan về Chế độ cụm từ Spark API (~3 phút đọc)
Đọc thêm — Câu trả lời hữu ích trên StackOverflow (~2 phút đọc)
Đọc thêm - Tổng quan về ứng dụng Spark trên Cloudera (~2 phút đọc)

Phew bạn đã thông qua tất cả các thuật ngữ và khái niệm. Bây giờ chúng ta hãy bắt tay vào thực hiện

cài đặt tia lửa

Tiêu đề đó có thể gây nhầm lẫn một chút, bởi vì, nói đúng ra, hướng dẫn này sẽ không chỉ cho bạn cách cài đặt Apache Spark. Cài đặt Spark có thể là một điều khó khăn. Đầu tiên, việc viết các ứng dụng Spark có thể được thực hiện bằng nhiều ngôn ngữ và mỗi ngôn ngữ được cài đặt hơi khác nhau. API cơ bản cho Spark được viết bằng Scala nhưng PySpark là API vượt trội để triển khai trong Python. Đối với các ứng dụng khoa học dữ liệu, việc sử dụng PySpark và Python được khuyến nghị rộng rãi hơn Scala, vì nó tương đối dễ triển khai hơn. Và vì vậy, thay vì cài đặt PySpark, hướng dẫn này sẽ chỉ cho bạn cách chạy nó trong Google Colab

Google Colab

Khi tôi cố gắng chạy PySpark trên máy tính của mình, tôi liên tục nhận được các hướng dẫn mâu thuẫn về nơi tải xuống (có thể tải xuống từ spark. apache. org hoặc pip được cài đặt chẳng hạn), chạy nó trong cái gì (nó có thể chạy trong Jupyter Notebooks hoặc trong shell pyspark gốc trong dòng lệnh) và có rất nhiều lệnh bash khó hiểu được rải khắp nơi. Là một nhà phân tích dữ liệu, phản ứng của tôi đối với các lệnh bash không phải là cài đặt pip nói chung là sự pha trộn giữa ghê tởm và tuyệt vọng, vì vậy tôi đã chuyển sang Google Colab

Google Colab là một sổ ghi chép python tương tác thực sự mạnh mẽ (. ipynb) có rất nhiều thư viện khoa học dữ liệu được cài đặt sẵn. Để biết thêm thông tin về nó là gì và cách chạy nó, hãy xem bài viết siêu hữu ích này (8 phút đọc)

Sau khi bạn đã có sổ tay Colab, để chạy Spark, bạn phải chạy khối mã sau (tôi biết đó không phải lỗi của tôi, nhưng tôi xin lỗi vì độ xấu của nó)

!apt-get install openjdk-8-jdk-headless -qq > /dev/null
!wget -q https://www-us.apache.org/dist/spark/spark-2.4.3/spark-2.4.3-bin-hadoop2.7.tgz
!tar xf spark-2.4.3-bin-hadoop2.7.tgz
!pip install -q findspark
import os
os.environ["JAVA_HOME"] = "/usr/lib/jvm/java-8-openjdk-amd64"
os.environ["SPARK_HOME"] = "/content/spark-2.4.3-bin-hadoop2.7"
import findspark
findspark.init()

GHI CHÚ. Khi tôi chạy khối mã này lần đầu tiên, nó không chạy. Đó là bởi vì đã có một phiên bản Spark mới được phát hành kể từ khi mã tôi tìm thấy được viết và tôi đang cố truy cập phiên bản Spark cũ hơn mà không thể tìm thấy. Vì vậy, nếu đoạn mã trên không chạy, hãy kiểm tra kỹ trang web này để xem phiên bản mới nhất của Spark là gì và thay thế ở mọi nơi bạn thấy “2. 4. 3” trong đoạn mã trên thành bất kể phiên bản mới nhất là gì

Về cơ bản, những gì khối mã này thực hiện là tải xuống đúng phiên bản Java (Spark sử dụng một số Java) và Spark, đặt PATH cho các phiên bản đó và khởi chạy Spark trong sổ ghi chép của bạn

Nếu bạn muốn sử dụng Spark trên một nền tảng khác ngoài Colab, thì đây là những hướng dẫn hữu ích nhất mà tôi tìm thấy (theo thứ tự hữu ích), hy vọng một trong số đó có thể giúp bạn tiếp tục

Tài nguyên cài đặt— Bắt đầu với PySpark và Jupyter
Tài nguyên cài đặt — Cách sử dụng PySpark trên máy tính của bạn
Tài nguyên cài đặt — Cách cài đặt PySpark cục bộ
Tài nguyên cài đặt — Cách bắt đầu với PySpark

Mã hóa trong PySpark

Vì chúng tôi muốn làm việc với dữ liệu cột, nên chúng tôi sẽ sử dụng DataFrames là một phần của Spark SQL

GHI CHÚ. Để tránh nhầm lẫn có thể xảy ra, mặc dù thực tế là chúng tôi sẽ làm việc với Spark SQL, nhưng không có mã nào trong số này sẽ là mã SQL. Bạn có thể viết các truy vấn SQL khi làm việc với Spark DataFrames nhưng bạn không cần phải

Định cấu hình SparkSession

Điểm vào để sử dụng Spark SQL là một đối tượng có tên là

from google.colab import files
files.upload()
2. Nó khởi tạo Ứng dụng Spark mà tất cả mã cho Phiên đó sẽ chạy trên đó

from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("local[*]") \
.appName("Learning_Spark") \
.getOrCreate()

GHI CHÚ. ký tự “\” là ngữ cảnh này được gọi là ký tự tiếp nối, đây chỉ là một công cụ gói hữu ích để làm cho các dòng mã dài dễ đọc hơn

  • from google.colab import files
    files.upload()
    3 — cấp quyền truy cập vào Builder API được sử dụng để định cấu hình phiên
  • from google.colab import files
    files.upload()
    4 — xác định nơi chương trình sẽ chạy; . Trong trường hợp này, các chương trình của chúng tôi sẽ chạy trên máy chủ của Google
  • from google.colab import files
    files.upload()
    7 — phương thức tùy chọn để đặt tên cho Ứng dụng Spark
  • from google.colab import files
    files.upload()
    8 — nhận một
    from google.colab import files
    files.upload()
    2 hiện có hoặc tạo một cái mới nếu không tồn tại

Kiểm tra Builder API để biết thêm tùy chọn khi xây dựng một

from google.colab import files
files.upload()
2

Đang tải dữ liệu

Để mở một tệp cục bộ trên Google Colab, bạn cần chạy đoạn mã sau. Đoạn mã này sẽ nhắc bạn chọn một tệp từ máy tính của mình

from google.colab import files
files.upload()

Đối với hướng dẫn này, chúng tôi sẽ làm việc với bộ dữ liệu về doanh số trò chơi điện tử từ Kaggle. Nó có thể được tìm thấy ở đây

Bây giờ hãy tải dữ liệu của chúng tôi vào Spark DataFrame bằng hàm

data = spark.read.csv('Video_Games_Sales.csv',inferSchema=True, header=True)
1. (Tôi đã rút ngắn tên tệp cho ngắn gọn)

data = spark.read.csv('Video_Games_Sales.csv',inferSchema=True, header=True)

GHI CHÚ. Chức năng này dành riêng để đọc các tệp CSV vào DataFrame trong PySparkSQL. Nó sẽ không hoạt động để tải dữ liệu vào RDD và các ngôn ngữ khác nhau (ngoài Python) có cú pháp khác nhau. Thận trọng khi tìm kiếm trợ giúp trực tuyến vì nhiều tài nguyên không giả sử Spark SQL hoặc Python

Khám phá dữ liệu

Bây giờ, hãy chuyển sang tìm hiểu cách chúng ta có thể làm quen hơn với dữ liệu của mình

Điều đầu tiên chúng ta có thể làm là kiểm tra hình dạng của DataFrame của chúng ta. Không giống như Pandas, không có phương pháp chuyên dụng nào cho việc này nhưng chúng ta có thể sử dụng

data = spark.read.csv('Video_Games_Sales.csv',inferSchema=True, header=True)
2 và
data = spark.read.csv('Video_Games_Sales.csv',inferSchema=True, header=True)
3 để tự lấy thông tin

data.count(), len(data.columns)>>> (16719, 16)

Phương thức

data = spark.read.csv('Video_Games_Sales.csv',inferSchema=True, header=True)
2 trả về số hàng trong DataFrame và
data = spark.read.csv('Video_Games_Sales.csv',inferSchema=True, header=True)
5 trả về danh sách tên cột

GHI CHÚ. Chúng tôi không thực sự phải in chúng vì Colab sẽ tự động hiển thị đầu ra cuối cùng của mỗi ô. Nếu bạn muốn hiển thị nhiều hơn một đầu ra, bạn sẽ phải in chúng (trừ khi bạn sử dụng giải pháp thay thế này, giải pháp này rất hay và cũng hoạt động trong Jupyter Notebooks)

Xem khung dữ liệu
Để xem DataFrame, hãy sử dụng phương thức

data = spark.read.csv('Video_Games_Sales.csv',inferSchema=True, header=True)
6

data.show(5)

Đầu ra từ dữ liệu. hiển thị(5)

Như bạn có thể thấy, việc chạy

data = spark.read.csv('Video_Games_Sales.csv',inferSchema=True, header=True)
7 đã hiển thị 5 hàng đầu tiên của Khung dữ liệu của chúng tôi, cùng với tiêu đề. Gọi
data = spark.read.csv('Video_Games_Sales.csv',inferSchema=True, header=True)
6 không có tham số sẽ trả về 20 bản ghi đầu tiên

Hãy xem dữ liệu của chúng tôi bao gồm những gì bằng cách sử dụng. Phương pháp

data = spark.read.csv('Video_Games_Sales.csv',inferSchema=True, header=True)
9 (bạn có thể thay thế bằng phương pháp
data.count(), len(data.columns)>>> (16719, 16)
0)

data.printSchema()

Đầu ra từ dữ liệu. printSchema()

Một số điểm đáng chú ý từ đầu ra này là Year_of_Release và User_Score có một loại chuỗi, mặc dù chúng là số. Nó cũng cho chúng ta biết rằng mỗi cột cho phép các giá trị null có thể nhìn thấy trong 5 hàng đầu tiên

Chúng tôi cũng có thể chọn lọc những cột mà chúng tôi muốn hiển thị bằng phương thức

data.count(), len(data.columns)>>> (16719, 16)
1. Hãy chỉ xem Tên, Nền tảng, User_Score và User_Count

data.select("Name","Platform","User_Score","User_Count") \
.show(15, truncate=False)

Đầu ra từ dữ liệu. lựa chọn(). chỉ()

Bao gồm tham số

data.count(), len(data.columns)>>> (16719, 16)
2 điều chỉnh kích thước của các cột để ngăn các giá trị bị cắt

Tổng hợp Thống kê/Thông tin
Chúng tôi có thể sử dụng phương pháp

data.count(), len(data.columns)>>> (16719, 16)
3 để lấy số liệu thống kê tóm tắt về các cột mà chúng tôi chọn

data.describe(["User_Score","User_Count"]).show()

Đầu ra từ dữ liệu. diễn tả(). chỉ()

Một số điểm đáng chú ý từ đầu ra này là dường như có một giá trị “tbd” lạ trong cột User_Score. Số lượng cho User_Score cũng cao hơn User_Count nhưng thật khó để biết liệu đó có phải là do thực sự có nhiều giá trị hơn trong User_Score hay nếu các giá trị “tbd” đang tăng số lượng một cách giả tạo. Chúng ta sẽ tìm hiểu cách lọc những giá trị đó sau

Chúng tôi cũng có thể muốn nhận một số thông tin về loại nền tảng nào trong cột Nền tảng và cách chúng được phân phối. Chúng ta có thể sử dụng

data.count(), len(data.columns)>>> (16719, 16)
4 cho việc này và sắp xếp nó bằng cách sử dụng
data.count(), len(data.columns)>>> (16719, 16)
5

data.groupBy("Platform") \
.count() \
.orderBy("count", ascending=False) \
.show(10)

Đầu ra từ dữ liệu. nhómBy(). đặt bởi(). chỉ()

Ở đây chúng tôi đang xem xét 10 nền tảng thường xuyên nhất. Chúng tôi có thể nói bộ dữ liệu này khá cũ vì tôi không thấy PS4 ở đâu cả 🤔

Lọc khung dữ liệu
Hãy tạo một DataFrame mới có các giá trị null cho User_Score và User_Count và các giá trị “tbd” được lọc ra bằng phương pháp

data.count(), len(data.columns)>>> (16719, 16)
6

from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("local[*]") \
.appName("Learning_Spark") \
.getOrCreate()
0

data.count(), len(data.columns)>>> (16719, 16)
7 trả về True cho bất kỳ bản ghi nào không có giá trị null trong User_Score hoặc User_Count.
data.count(), len(data.columns)>>> (16719, 16)
8 trả về True cho bất kỳ bản ghi nào không có “tbd” trong User_Score

Chúng tôi có thể kiểm tra lại xem bộ lọc của chúng tôi có hoạt động hay không bằng cách xây dựng lại các hình ảnh trực quan hóa trước đó của chúng tôi

Số liệu thống kê tóm tắt được xây dựng lại và DataFrame với các giá trị được lọc ra

Đó là đủ Khám phá dữ liệu để bắt đầu, bây giờ hãy xây dựng một mô hình

Xây dựng mô hình trong PySpark

Xây dựng các mô hình trong PySpark trông hơi khác so với những gì bạn có thể đã quen và bạn sẽ thấy các thuật ngữ như Transformer, Estimator và Param. Hướng dẫn này sẽ không đi sâu vào ý nghĩa của các thuật ngữ đó nhưng bên dưới là liên kết dẫn đến mô tả ngắn gọn về ý nghĩa của chúng

Đọc thêm — Học máy trong Spark (~5–10 phút đọc)

Cài đặt
Đối với một ví dụ về hồi quy tuyến tính, hãy xem liệu chúng ta có thể dự đoán User_Score từ Year_of_Release, Global_Sales, Critic_Score và User_Count

Trước tiên, hãy mã hóa lại tất cả các yếu tố dự đoán của chúng ta thành Nhân đôi (tôi thấy rằng điều này đã loại bỏ một số lỗi thực sự nghiêm trọng sau này)

from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("local[*]") \
.appName("Learning_Spark") \
.getOrCreate()
1

Chúng tôi sử dụng phương pháp

data.count(), len(data.columns)>>> (16719, 16)
9, phương pháp này tạo cột mới hoặc thay thế cột đã tồn tại. Vì vậy, ví dụ, cột Year_of_Release được thay thế bằng một phiên bản của chính nó đã được chuyển thành gấp đôi

VectorAssembler
Bước tiếp theo là chuyển dữ liệu của chúng tôi sang dạng mà PySpark có thể tạo mô hình với. Để làm điều này, chúng tôi sử dụng một thứ gọi là

data.show(5)
0

from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("local[*]") \
.appName("Learning_Spark") \
.getOrCreate()
2

Ở đây, chúng tôi đã phác thảo những tính năng mà chúng tôi muốn mô hình của mình sử dụng làm công cụ dự đoán để

data.show(5)
0 có thể lấy các cột đó và chuyển đổi chúng thành một cột duy nhất (được đặt tên là "công cụ dự đoán") chứa tất cả dữ liệu mà chúng tôi muốn dự đoán bằng

from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("local[*]") \
.appName("Learning_Spark") \
.getOrCreate()
3

Đầu ra từ VectorAssembler. biến đổi(). cột

Điều mà

data.show(5)
2 làm là tạo một Khung dữ liệu mới với một cột mới ở cuối trong đó mỗi hàng chứa danh sách tất cả các tính năng mà chúng tôi đã đưa vào tham số
data.show(5)
3 khi chúng tôi tạo trình biên dịch chương trình

Bước cuối cùng để dữ liệu của chúng tôi sẵn sàng được sử dụng trong một mô hình là tự thu thập cột dự đoán mới mà chúng tôi vừa tạo và User_Score (biến mục tiêu của chúng tôi) trong DataFrame

from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("local[*]") \
.appName("Learning_Spark") \
.getOrCreate()
4

Dữ liệu cuối cùng chúng tôi sẽ sử dụng để xây dựng một mô hình

Tiếp theo là tách

data.show(5)
4 thành tập huấn luyện và kiểm tra

from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("local[*]") \
.appName("Learning_Spark") \
.getOrCreate()
5

đào tạo người mẫu
Bây giờ để đào tạo mô hình

from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("local[*]") \
.appName("Learning_Spark") \
.getOrCreate()
6

Sau khi nhập

data.show(5)
5 từ
data.show(5)
6, chúng tôi xây dựng một biến hồi quy và chúng tôi xác định rằng nó sẽ tìm kiếm một cột có tên là “bộ dự báo” làm các đặc điểm của mô hình và một cột có tên “User_Score” làm nhãn của mô hình. Tiếp theo, chúng tôi đào tạo nó với
data.show(5)
7 và cuối cùng đưa ra dự đoán với
data.show(5)
8

Chúng ta có thể truy cập các tham số của mô hình bằng đoạn mã sau

from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("local[*]") \
.appName("Learning_Spark") \
.getOrCreate()
7

Chúng tôi cũng có thể xem các dự đoán cuối cùng mà mô hình của chúng tôi đã thực hiện

from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("local[*]") \
.appName("Learning_Spark") \
.getOrCreate()
8

dự đoán mô hình

Đối tượng có tên là “pred” là một đối tượng LinearRegressionSummary và do đó, để truy xuất DataFrame với các dự đoán, chúng tôi gọi

data.show(5)
9

Đánh giá mô hình
Để có thêm thông tin chi tiết về cách thức hoạt động của mô hình, chúng ta có thể sử dụng

data.printSchema()
0 được xây dựng như thế này

from pyspark.sql import SparkSession
spark = SparkSession.builder \
.master("local[*]") \
.appName("Learning_Spark") \
.getOrCreate()
9

Hãy tính toán một số thống kê cho mô hình

from google.colab import files
files.upload()
0

nào trả về

from google.colab import files
files.upload()
1

Từ đó, chúng ta có thể giải thích rằng mô hình của chúng ta có xu hướng khoảng 1. Giảm 125 điểm xếp hạng so với User_Score thực tế (theo rmse). Giá trị r² cho chúng tôi biết rằng các yếu tố dự đoán trong mô hình của chúng tôi có thể chiếm dưới 40% tổng số biến thiên trong User_Score. Đây chỉ là cái nhìn đầu tiên và tôi khuyên bạn nên tìm hiểu các thông số và tính năng của mô hình để thực hành thêm

Đọc thêm - Ví dụ mã chi tiết về hồi quy tuyến tính (~ hơn 20 phút để xem qua toàn bộ nội dung)
Đọc thêm - Ví dụ mã chi tiết về hồi quy logistic bằng SQL (~10 phút)
Đọc thêm — Ví dụ về hồi quy tuyến tính, cây quyết định và hồi quy cây tăng cường độ dốc (đọc 6 phút)

Đây chỉ là phần nổi của tảng băng chìm về loại mô hình bạn có thể thực hiện trong PySpark, nhưng tôi hy vọng hướng dẫn này đã trang bị cho bạn đủ kiến ​​thức để đặt chân vào cánh cửa của Dữ liệu lớn

Phần kết luận

Ồ. Đạo cụ cho bạn nếu bạn đã đi đến cuối cùng. Bạn đã tiếp xúc với rất nhiều khái niệm mới, từ thuật ngữ của điện toán phân tán và Spark, đến triển khai các kỹ thuật mô hình hóa và khám phá dữ liệu trong PySpark. Tôi hy vọng rằng hướng dẫn này có thể là tài nguyên cho bạn khi bạn tiếp tục làm việc với Spark

Tôi có thể viết Python trong PySpark không?

Với PySpark, bạn có thể viết Python và các lệnh giống SQL để thao tác và phân tích dữ liệu trong môi trường xử lý phân tán.

Làm cách nào để kết nối Spark bằng Python?

Các ứng dụng PySpark độc lập nên được chạy bằng cách sử dụng tập lệnh bin/pyspark , tập lệnh này sẽ tự động định cấu hình môi trường Java và Python bằng cách sử dụng cài đặt trong conf/spark-env. sh hoặc. cmd. Tập lệnh tự động thêm gói bin/pyspark vào PYTHONPATH.

Làm cách nào để sử dụng Python trong vỏ Spark?

Chuyển đến thư mục Cài đặt Spark từ dòng lệnh và nhập bin/pyspark rồi nhấn enter , thao tác này sẽ khởi chạy trình bao pyspark và cung cấp cho bạn lời nhắc tương tác với Spark bằng ngôn ngữ Python. Nếu bạn đã đặt Spark trong PATH thì chỉ cần nhập pyspark vào dòng lệnh hoặc thiết bị đầu cuối (người dùng mac).

Tôi có nên sử dụng Python hoặc Scala cho Spark không?

Nếu bạn muốn làm việc trong một dự án nhỏ hơn với những lập trình viên ít kinh nghiệm hơn, thì Python là lựa chọn thông minh . Tuy nhiên, nếu bạn có một dự án lớn cần nhiều tài nguyên và xử lý song song, thì Scala là cách tốt nhất để thực hiện.