Sự khác biệt giữa DataFrame, Dataset và RDD trong Spark


Câu trả lời:


232

A DataFrameđược định nghĩa tốt với tìm kiếm google cho "Định nghĩa DataFrame":

Khung dữ liệu là một bảng hoặc cấu trúc giống như mảng hai chiều, trong đó mỗi cột chứa các phép đo trên một biến và mỗi hàng chứa một trường hợp.

Vì vậy, a DataFramecó siêu dữ liệu bổ sung do định dạng bảng của nó, cho phép Spark chạy một số tối ưu hóa nhất định trên truy vấn đã hoàn thành.

Một RDD, mặt khác, chỉ đơn thuần là một R esilient D istributed D ataset đó là nhiều hơn một Blackbox của dữ liệu mà không thể được tối ưu hóa như các hoạt động có thể được thực hiện đối với nó, không phải là hạn chế.

Tuy nhiên, bạn có thể chuyển từ DataFrame sang phương thức RDDthông qua rddphương thức của nó và bạn có thể đi từ một RDDđến một DataFrame(nếu RDD ở định dạng bảng) thông qua toDFphương thức

Nói chung , nên sử dụng một DataFramenơi có thể do tối ưu hóa truy vấn tích hợp.


6
Trả lời không cung cấp giải thích về bộ dữ liệu. Theo Spark- The Definitive Guide, bộ dữ liệu là một loại api có cấu trúc an toàn. Vì vậy, bạn có thể cung cấp loại lược đồ của bạn trước.
Chintan Pandya

3
Cảm ơn - tiêu đề và mô tả ban đầu đã được chỉnh sửa tốt sau các câu hỏi ban đầu (không bao gồm Bộ dữ liệu)
Justin Pihony

219

Điều đầu tiên DataFrameđược phát triển từ SchemaRDD.

phương pháp được xử lý đểSchemaRDD

Có .. chuyển đổi giữa DataframeRDDlà hoàn toàn có thể.

Dưới đây là một số đoạn mã mẫu.

  • df.rddRDD[Row]

Dưới đây là một số tùy chọn để tạo dataframe.

  • 1) yourrddOffrow.toDFchuyển đổi thành DataFrame.

  • 2) Sử dụng createDataFramebối cảnh sql

    val df = spark.createDataFrame(rddOfRow, schema)

trong đó lược đồ có thể từ một số tùy chọn bên dưới như được mô tả bởi bài viết SO đẹp ..
Từ lớp trường hợp scala và api phản chiếu scala

import org.apache.spark.sql.catalyst.ScalaReflection
val schema = ScalaReflection.schemaFor[YourScalacaseClass].dataType.asInstanceOf[StructType]

HOẶC sử dụng Encoders

import org.apache.spark.sql.Encoders
val mySchema = Encoders.product[MyCaseClass].schema

như được mô tả bởi Schema cũng có thể được tạo bằng StructTypeStructField

val schema = new StructType()
  .add(StructField("id", StringType, true))
  .add(StructField("col1", DoubleType, true))
  .add(StructField("col2", DoubleType, true)) etc...

Mô tả hình ảnh

Trên thực tế, hiện đã có 3 API Spark Spark ..

nhập mô tả hình ảnh ở đây

  1. RDD API:

Các RDD(Resilient Distributed Dataset) API đã được trong Spark từ việc phát hành 1.0.

Các RDDAPI cung cấp nhiều phương pháp chuyển đổi, chẳng hạn như map(), filter(), và reduce() để thực hiện tính toán trên dữ liệu. Mỗi phương thức này dẫn đến một RDDdữ liệu mới đại diện cho dữ liệu được chuyển đổi. Tuy nhiên, các phương thức này chỉ xác định các hoạt động sẽ được thực hiện và các phép biến đổi không được thực hiện cho đến khi một phương thức hành động được gọi. Ví dụ về các phương thức hành động là collect() và saveAsObjectFile().

Ví dụ RDD:

rdd.filter(_.age > 21) // transformation
   .map(_.last)// transformation
.saveAsObjectFile("under21.bin") // action

Ví dụ: Lọc theo thuộc tính với RDD

rdd.filter(_.age > 21)
  1. DataFrame API

Spark 1.3 đã giới thiệu DataFrameAPI mới như một phần của sáng kiến ​​Dự án Vonfram nhằm tìm cách cải thiện hiệu suất và khả năng mở rộng của Spark. Các DataFramegiới thiệu API khái niệm về một sơ đồ để mô tả dữ liệu, cho phép Spark để quản lý các lược đồ và chỉ truyền dữ liệu giữa các nút, một cách hiệu quả hơn nhiều so với sử dụng Java serialization.

Các DataFrameAPI là hoàn toàn khác nhau từ các RDDAPI bởi vì nó là một API để xây dựng một kế hoạch truy vấn quan hệ mà Catalyst ưu Spark sau đó có thể thực thi. API là tự nhiên đối với các nhà phát triển đã quen thuộc với việc xây dựng kế hoạch truy vấn

Ví dụ kiểu SQL:

df.filter("age > 21");

Hạn chế: Do mã đang đề cập đến các thuộc tính dữ liệu theo tên, nên trình biên dịch không thể bắt được bất kỳ lỗi nào. Nếu tên thuộc tính không chính xác thì lỗi sẽ chỉ được phát hiện khi chạy, khi kế hoạch truy vấn được tạo.

Một nhược điểm khác với DataFrameAPI là nó rất trung tâm và trong khi nó hỗ trợ Java, sự hỗ trợ bị hạn chế.

Ví dụ, khi tạo một DataFrametừ các RDDđối tượng Java hiện có , trình tối ưu hóa Catalyst của Spark không thể suy ra lược đồ và giả định rằng bất kỳ đối tượng nào trong DataFrame đều thực hiện scala.Productgiao diện. Scala case classlàm việc ra khỏi hộp vì họ thực hiện giao diện này.

  1. Dataset API

Các DatasetAPI, phát hành như là một bản xem trước API trong Spark 1.6, nhằm cung cấp tốt nhất của cả hai thế giới; kiểu lập trình hướng đối tượng quen thuộc và loại an toàn thời gian biên dịch của RDDAPI nhưng với các lợi ích hiệu năng của trình tối ưu hóa truy vấn Catalyst. Các bộ dữ liệu cũng sử dụng cơ chế lưu trữ ngoài heap hiệu quả tương tự như DataFrameAPI.

Khi nói đến việc tuần tự hóa dữ liệu, DatasetAPI có khái niệm về bộ mã hóa dịch giữa các biểu diễn (đối tượng) của JVM và định dạng nhị phân bên trong của Spark. Spark có các bộ mã hóa tích hợp rất tiên tiến ở chỗ chúng tạo mã byte để tương tác với dữ liệu ngoài heap và cung cấp quyền truy cập theo yêu cầu cho các thuộc tính riêng lẻ mà không phải tuần tự hóa toàn bộ một đối tượng. Spark chưa cung cấp API để triển khai các bộ mã hóa tùy chỉnh, nhưng đó là kế hoạch phát hành trong tương lai.

Ngoài ra, DatasetAPI được thiết kế để hoạt động tốt như nhau với cả Java và Scala. Khi làm việc với các đối tượng Java, điều quan trọng là chúng hoàn toàn tuân thủ bean.

Ví dụ Datasetkiểu SQL API:

dataset.filter(_.age < 21);

Đánh giá khác nhau. giữa DataFrame& DataSet: nhập mô tả hình ảnh ở đây

Dòng chảy Catalist. . (Làm sáng tỏ trình bày DataFrame và Dataset từ đỉnh Spark) nhập mô tả hình ảnh ở đây

Đọc thêm ... bài viết về databricks - Câu chuyện về ba API Spark của Apache: RDDs và DataFrames và Bộ dữ liệu


Dataset cấu trúc gõ mạnh là gì? Nó khác với DataFrame như thế nào?
Arvind Kumar

Những loại lỗi phân tích được bao phủ trong bộ dữ liệu?
Neeleshkumar S

5
@ neelesh-srinivasan: lấy ví dụ trong cú pháp khung dữ liệu, df.filter("age > 21");điều này có thể được đánh giá / phân tích chỉ trong thời gian chạy. kể từ chuỗi của nó. Incase of Datasets, Datasets đều tuân thủ bean. Vì vậy, tuổi là tài sản đậu. nếu thuộc tính tuổi không có trong bean của bạn, thì bạn sẽ biết sớm trong thời gian biên dịch tức là (tức là dataset.filter(_.age < 21);). Lỗi phân tích có thể được đổi tên thành lỗi Đánh giá.
Ram Ghadiyaram

@NeeleshSrinivasan: để biết thêm thông tin và chi tiết, hãy xem apache-spark-api-so sánh
Ram Ghadiyaram

Hình ảnh đầu tiên là sai lệch. Các bộ dữ liệu không có sẵn trong Python
Yeikel

135

Apache Spark cung cấp ba loại API

  1. RDD
  2. Khung dữ liệu
  3. Bộ dữ liệu

So sánh API RDD, Dataframe và Dataset

Dưới đây là so sánh API giữa RDD, Dataframe và Dataset.

RDD

Tóm tắt chính mà Spark cung cấp là một bộ dữ liệu phân tán (RDD) có khả năng phục hồi, là một tập hợp các phần tử được phân vùng trên các nút của cụm có thể được vận hành song song.

Các tính năng RDD: -

  • Bộ sưu tập phân tán:
    RDD sử dụng các hoạt động MapReduce được áp dụng rộng rãi để xử lý và tạo các bộ dữ liệu lớn với thuật toán phân tán song song trên một cụm. Nó cho phép người dùng viết các tính toán song song, sử dụng một tập hợp các toán tử cấp cao mà không phải lo lắng về phân phối công việc và khả năng chịu lỗi.

  • Bất biến: RDD bao gồm một tập hợp các bản ghi được phân vùng. Phân vùng là một đơn vị cơ bản của sự song song trong RDD và mỗi phân vùng là một phân chia dữ liệu hợp lý, không thay đổi và được tạo thông qua một số biến đổi trên các phân vùng hiện có. Tính khả dụng giúp đạt được tính nhất quán trong tính toán.

  • Chịu lỗi: Trong trường hợp chúng tôi mất một số phân vùng của RDD, chúng tôi có thể phát lại phép chuyển đổi trên phân vùng đó để đạt được cùng một tính toán, thay vì sao chép dữ liệu qua nhiều nút. Đặc điểm này là lợi ích lớn nhất của RDD vì nó tiết kiệm rất nhiều nỗ lực trong quản lý và nhân rộng dữ liệu và do đó đạt được các tính toán nhanh hơn.

  • Đánh giá lười biếng: Tất cả các biến đổi trong Spark đều lười biếng, ở chỗ chúng không tính toán kết quả của chúng ngay lập tức. Thay vào đó, họ chỉ nhớ các phép biến đổi được áp dụng cho một số tập dữ liệu cơ sở. Các phép biến đổi chỉ được tính khi một hành động yêu cầu kết quả được trả về chương trình trình điều khiển.

  • Các phép biến đổi chức năng: RDD hỗ trợ hai loại hoạt động: phép biến đổi, tạo ra một tập dữ liệu mới từ một kiểu hiện có và các hành động, trả về một giá trị cho chương trình trình điều khiển sau khi chạy một phép tính trên tập dữ liệu.

  • Các định dạng xử lý dữ liệu:
    Nó có thể dễ dàng và hiệu quả xử lý dữ liệu được cấu trúc cũng như dữ liệu phi cấu trúc.

  • Ngôn ngữ lập trình được hỗ trợ:
    API RDD có sẵn bằng Java, Scala, Python và R.

Giới hạn RDD: -

  • Không có công cụ tối ưu hóa sẵn có: Khi làm việc với dữ liệu có cấu trúc, RDD không thể tận dụng các tối ưu hóa tiên tiến của Spark bao gồm tối ưu hóa chất xúc tác và công cụ thực hiện Vonfram. Các nhà phát triển cần tối ưu hóa từng RDD dựa trên các thuộc tính của nó.

  • Xử lý dữ liệu có cấu trúc: Không giống như Dataframe và bộ dữ liệu, RDD không suy ra lược đồ của dữ liệu đã nhập và yêu cầu người dùng chỉ định nó.

Dữ liệu dữ liệu

Spark giới thiệu Dataframes trong phiên bản Spark 1.3. Dataframe vượt qua các thách thức chính mà RDD đã có.

DataFrame là một tập hợp dữ liệu phân tán được sắp xếp thành các cột được đặt tên. Nó tương đương về mặt khái niệm với một bảng trong cơ sở dữ liệu quan hệ hoặc Khung dữ liệu R / Python. Cùng với Dataframe, Spark cũng giới thiệu trình tối ưu hóa chất xúc tác, sử dụng các tính năng lập trình nâng cao để xây dựng trình tối ưu hóa truy vấn mở rộng.

Các tính năng của khung dữ liệu: -

  • Bộ sưu tập phân tán của đối tượng Row: DataFrame là tập hợp dữ liệu phân tán được sắp xếp thành các cột được đặt tên. Nó là khái niệm tương đương với một bảng trong cơ sở dữ liệu quan hệ, nhưng với tối ưu hóa phong phú hơn dưới mui xe.

  • Xử lý dữ liệu: Xử lý các định dạng dữ liệu có cấu trúc và không cấu trúc (Avro, CSV, tìm kiếm đàn hồi và Cassandra) và các hệ thống lưu trữ (HDFS, bảng HIVE, MySQL, v.v.). Nó có thể đọc và viết từ tất cả các nguồn dữ liệu khác nhau.

  • Tối ưu hóa bằng cách sử dụng trình tối ưu hóa chất xúc tác: Nó cung cấp năng lượng cho cả truy vấn SQL và API DataFrame. Dataframe sử dụng khung chuyển đổi cây xúc tác theo bốn giai đoạn,

     1.Analyzing a logical plan to resolve references
     2.Logical plan optimization
     3.Physical planning
     4.Code generation to compile parts of the query to Java bytecode.
    
  • Khả năng tương thích Hive: Sử dụng Spark SQL, bạn có thể chạy các truy vấn Hive chưa sửa đổi trên kho Hive hiện tại của mình. Nó sử dụng lại lối vào Hive và MetaStore và cung cấp cho bạn khả năng tương thích hoàn toàn với dữ liệu, truy vấn và UDF hiện có.

  • Vonfram: Vonfram cung cấp một phụ trợ thực thi vật lý, trong đó quản lý bộ nhớ một cách tự nhiên và tự động tạo mã byte để đánh giá biểu thức.

  • Ngôn ngữ lập trình được hỗ trợ:
    API Dataframe có sẵn bằng Java, Scala, Python và R.

Giới hạn khung dữ liệu: -

  • An toàn kiểu thời gian biên dịch: Như đã thảo luận, API Dataframe không hỗ trợ an toàn thời gian biên dịch, điều này hạn chế bạn thao tác dữ liệu khi cấu trúc không biết. Ví dụ sau hoạt động trong thời gian biên dịch. Tuy nhiên, bạn sẽ nhận được một ngoại lệ Runtime khi thực thi mã này.

Thí dụ:

case class Person(name : String , age : Int) 
val dataframe = sqlContext.read.json("people.json") 
dataframe.filter("salary > 10000").show 
=> throws Exception : cannot resolve 'salary' given input age , name

Đây là một thách thức đặc biệt khi bạn đang làm việc với một số bước chuyển đổi và tổng hợp.

  • Không thể hoạt động trên đối tượng miền (đối tượng miền bị mất): Một khi bạn đã chuyển đổi một đối tượng miền thành khung dữ liệu, bạn không thể tạo lại nó từ nó. Trong ví dụ sau, một khi chúng ta đã tạo personDF từ personRDD, chúng ta sẽ không phục hồi RDD gốc của lớp Person (RDD [Person]).

Thí dụ:

case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.createDataframe(personRDD)
personDF.rdd // returns RDD[Row] , does not returns RDD[Person]

API dữ liệu

API dữ liệu là một phần mở rộng cho DataFrames cung cấp giao diện lập trình hướng đối tượng, an toàn kiểu. Nó là một tập hợp các đối tượng được gõ mạnh, bất biến được ánh xạ tới một lược đồ quan hệ.

Tại cốt lõi của Bộ dữ liệu, API là một khái niệm mới gọi là bộ mã hóa, chịu trách nhiệm chuyển đổi giữa các đối tượng JVM và biểu diễn dạng bảng. Biểu diễn dạng bảng được lưu trữ bằng định dạng nhị phân Vonfram bên trong, cho phép thực hiện các thao tác trên dữ liệu nối tiếp và cải thiện việc sử dụng bộ nhớ. Spark 1.6 hỗ trợ tự động tạo bộ mã hóa cho nhiều loại, bao gồm các loại nguyên thủy (ví dụ: String, Integer, Long), các lớp vỏ Scala và Đậu Java.

Tính năng bộ dữ liệu: -

  • Cung cấp tốt nhất cả RDD và Dataframe: RDD (lập trình chức năng, loại an toàn), DataFrame (mô hình quan hệ, tối ưu hóa truy vấn, thực hiện vonfram, sắp xếp và xáo trộn)

  • Bộ mã hóa: Với việc sử dụng Bộ mã hóa, có thể dễ dàng chuyển đổi bất kỳ đối tượng JVM nào thành Bộ dữ liệu, cho phép người dùng làm việc với cả dữ liệu có cấu trúc và không cấu trúc không giống như Dataframe.

  • Ngôn ngữ lập trình được hỗ trợ: API dữ liệu hiện chỉ khả dụng trong Scala và Java. Python và R hiện không được hỗ trợ trong phiên bản 1.6. Hỗ trợ Python được dự kiến ​​cho phiên bản 2.0.

  • Loại an toàn: API dữ liệu cung cấp an toàn thời gian biên dịch mà không có sẵn trong Dataframes. Trong ví dụ dưới đây, chúng ta có thể thấy Dataset có thể hoạt động như thế nào trên các đối tượng miền với các hàm lambda biên dịch.

Thí dụ:

case class Person(name : String , age : Int)
val personRDD = sc.makeRDD(Seq(Person("A",10),Person("B",20)))
val personDF = sqlContext.createDataframe(personRDD)
val ds:Dataset[Person] = personDF.as[Person]
ds.filter(p => p.age > 25)
ds.filter(p => p.salary > 25)
 // error : value salary is not a member of person
ds.rdd // returns RDD[Person]
  • Khả năng tương tác: Bộ dữ liệu cho phép bạn dễ dàng chuyển đổi RDD và Dataframes hiện tại của mình thành bộ dữ liệu mà không cần mã soạn sẵn.

Giới hạn API dữ liệu: -

  • Yêu cầu truyền kiểu vào Chuỗi: Truy vấn dữ liệu từ bộ dữ liệu hiện yêu cầu chúng tôi chỉ định các trường trong lớp dưới dạng chuỗi. Khi chúng tôi đã truy vấn dữ liệu, chúng tôi buộc phải chuyển cột sang loại dữ liệu được yêu cầu. Mặt khác, nếu chúng ta sử dụng thao tác bản đồ trên Bộ dữ liệu, nó sẽ không sử dụng trình tối ưu hóa Catalyst.

Thí dụ:

ds.select(col("name").as[String], $"age".as[Int]).collect()

Không hỗ trợ Python và R: Kể từ phiên bản 1.6, Bộ dữ liệu chỉ hỗ trợ Scala và Java. Hỗ trợ Python sẽ được giới thiệu trong Spark 2.0.

API Datasets mang lại một số lợi thế so với API RDD và Dataframe hiện có với loại lập trình chức năng và an toàn tốt hơn. Với thách thức về yêu cầu truyền kiểu trong API, bạn vẫn không phải là loại an toàn cần thiết và sẽ làm cho mã của bạn dễ vỡ hơn.


2
Từ spark.apache.org/docs/latest/ Mạnh , Trong API Scala, DataFrame chỉ đơn giản là một bí danh loại của Dataset [Row].
Dean Chen

vậy có ổn không khi nói rằng với tập dữ liệu, chúng ta đạt được loại an toàn và mất trình tối ưu hóa?
Khoa

@BlueSky bạn đạt được loại an toàn và vẫn có trình tối ưu hóa
Gabber 18/03/18

@AmitDubey Điều đó không đúng. Datasetkhông phải là biểu thức LINQ và lambda không thể được hiểu là cây biểu thức. Do đó, có các hộp đen và bạn mất khá nhiều lợi ích tối ưu hóa (nếu không phải tất cả). Chỉ là một tập hợp con nhỏ của các nhược điểm có thể có: Bộ dữ liệu Spark 2.0 so với DataFrame . Ngoài ra, chỉ để lặp lại một cái gì đó tôi đã nêu nhiều lần - nói chung, việc kiểm tra loại đầu cuối chung là không thể với DatasetAPI. Joins chỉ là ví dụ nổi bật nhất.
zero323

52

Tất cả (RDD, DataFrame và Dataset) trong một hình ảnh.

RDD vs DataFrame vs Dataset

tín dụng hình ảnh

RDD

RDD là tập hợp các phần tử chịu lỗi có thể được vận hành song song.

DataFrame

DataFramelà một bộ dữ liệu được tổ chức thành các cột được đặt tên. Nó tương đương về mặt khái niệm với một bảng trong cơ sở dữ liệu quan hệ hoặc khung dữ liệu trong R / Python, nhưng với sự tối ưu hóa phong phú hơn dưới mui xe .

Dataset

Datasetlà một bộ sưu tập dữ liệu phân tán. Dataset là một giao diện mới được thêm vào trong Spark 1.6, cung cấp các lợi ích của RDD (gõ mạnh, khả năng sử dụng các hàm lambda mạnh mẽ) với các lợi ích của công cụ thực thi được tối ưu hóa của Spark SQL .


Ghi chú:

Bộ dữ liệu của hàng ( Dataset[Row]) trong Scala / Java thường sẽ được gọi là DataFrames .


Nice comparison of all of them with a code snippet.

RDD vs DataFrame vs Dataset có mã

nguồn


Hỏi: Bạn có thể chuyển đổi cái này sang cái khác như RDD sang DataFrame hoặc ngược lại không?

Vâng, cả hai đều có thể

1. RDDđến DataFramevới.toDF()

val rowsRdd: RDD[Row] = sc.parallelize(
  Seq(
    Row("first", 2.0, 7.0),
    Row("second", 3.5, 2.5),
    Row("third", 7.0, 5.9)
  )
)

val df = spark.createDataFrame(rowsRdd).toDF("id", "val1", "val2")

df.show()
+------+----+----+
|    id|val1|val2|
+------+----+----+
| first| 2.0| 7.0|
|second| 3.5| 2.5|
| third| 7.0| 5.9|
+------+----+----+

nhiều cách hơn: Chuyển đổi một đối tượng RDD thành Dataframe trong Spark

2. DataFrame/ DataSetđến RDDvới .rdd()phương pháp

val rowsRdd: RDD[Row] = df.rdd() // DataFrame to RDD

27

Bởi vì DataFrameđược đánh máy yếu và các nhà phát triển không nhận được lợi ích của hệ thống loại. Ví dụ: giả sử bạn muốn đọc một cái gì đó từ SQL và chạy một số tổng hợp trên đó:

val people = sqlContext.read.parquet("...")
val department = sqlContext.read.parquet("...")

people.filter("age > 30")
  .join(department, people("deptId") === department("id"))
  .groupBy(department("name"), "gender")
  .agg(avg(people("salary")), max(people("age")))

Khi bạn nói people("deptId"), bạn không nhận lại được Int, hoặc a Long, bạn đang lấy lại một Columnđối tượng mà bạn cần thao tác. Trong các ngôn ngữ có hệ thống loại phong phú như Scala, cuối cùng bạn sẽ mất tất cả các loại an toàn làm tăng số lỗi thời gian chạy cho những thứ có thể được phát hiện tại thời điểm biên dịch.

Trái lại, DataSet[T]được đánh máy. khi bạn làm:

val people: People = val people = sqlContext.read.parquet("...").as[People]

Bạn đang thực sự lấy lại một Peopleđối tượng, trong đó deptIdlà một kiểu tích phân thực tế chứ không phải là một kiểu cột, do đó tận dụng lợi thế của hệ thống loại.

Kể từ Spark 2.0, API DataFrame và Dataset sẽ được hợp nhất, trong đó DataFramesẽ là bí danh loại DataSet[Row].


5
Nói chính xác như đối với Spark 2.0 Dataframe chỉ là bí danh choDataset[Row]
zero323

1
@ zero323 Đúng vậy, nhưng điều đó vẫn được đánh máy yếu, đó là những gì tôi đang cố gắng truyền đạt.
Yuval Itzchakov

Vâng, nhưng đó là vấn đề của các giá trị được lưu trữ hơn là một container. Ngay cả trong 1.6, hai cái này giống hệt nhau về mặt kỹ thuật và lý do chính để tách biệt DataFramelà để tránh phá vỡ các thay đổi API. Dù sao, chỉ muốn chỉ ra nó. Cảm ơn đã chỉnh sửa và upvote từ tôi.
zero323

25

Đơn giản chỉ RDDlà thành phần cốt lõi, nhưng DataFramelà một API được giới thiệu trong spark 1.30.

RDD

Bộ sưu tập các phân vùng dữ liệu được gọi RDD. Chúng RDDphải tuân theo một số thuộc tính như:

  • Bất biến,
  • Chịu lỗi,
  • Phân phối,
  • Hơn.

Đây RDDlà cấu trúc hoặc không cấu trúc.

Khung dữ liệu

DataFramelà một API có sẵn trong Scala, Java, Python và R. Nó cho phép xử lý bất kỳ loại dữ liệu có cấu trúc và bán cấu trúc nào. Để xác định DataFrame, 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 DataFrame. Bạn có thể dễ dàng tối ưu hóa RDDstrong DataFrame. Bạn có thể xử lý dữ liệu JSON, dữ liệu sàn, dữ liệu HiveQL tại một thời điểm bằng cách sử dụng DataFrame.

val sampleRDD = sqlContext.jsonFile("hdfs://localhost:9000/jsondata.json")

val sample_DF = sampleRDD.toDF()

Ở đây Sample_DF xem xét như DataFrame. sampleRDDlà (dữ liệu thô) được gọi RDD.


12

Hầu hết các câu trả lời đều đúng chỉ muốn thêm một điểm ở đây

Trong Spark 2.0, hai API (DataFrame + Dataset) sẽ được hợp nhất với nhau thành một API.

"Hợp nhất DataFrame và Dataset: Trong Scala và Java, DataFrame và Dataset đã được hợp nhất, tức là DataFrame chỉ là một bí danh loại cho Dataset of Row. Trong Python và R, do thiếu an toàn kiểu, DataFrame là giao diện lập trình chính."

Các bộ dữ liệu tương tự như RDD, tuy nhiên, thay vì sử dụng tuần tự hóa Java hoặc Kryo, chúng sử dụng Bộ mã hóa chuyên dụng để tuần tự hóa các đối tượng để xử lý hoặc truyền qua mạng.

Spark SQL hỗ trợ hai phương thức khác nhau để chuyển đổi RDD hiện có thành Bộ dữ liệu. Phương thức đầu tiên sử dụng sự phản chiếu để suy ra lược đồ của RDD có chứa các loại đối tượng cụ thể. Cách tiếp cận dựa trên sự phản chiếu này dẫn đến mã ngắn gọn hơn và hoạt động tốt khi bạn đã biết lược đồ trong khi viết ứng dụng Spark của mình.

Phương thức thứ hai để tạo Bộ dữ liệu là thông qua giao diện lập trình cho phép bạn xây dựng một lược đồ và sau đó áp dụng nó cho RDD hiện có. Mặc dù phương thức này dài dòng hơn, nhưng nó cho phép bạn xây dựng Bộ dữ liệu khi các cột và kiểu của chúng không được biết cho đến khi chạy.

Ở đây bạn có thể tìm thấy câu trả lời hội thoại khung dữ liệu RDD tof

Cách chuyển đổi đối tượng rdd thành dataframe trong spark


8

Một DataFrame tương đương với một bảng trong RDBMS và cũng có thể được thao tác theo các cách tương tự như các bộ sưu tập phân tán "gốc" trong RDD. Không giống như RDD, Datafram theo dõi lược đồ và hỗ trợ các hoạt động quan hệ khác nhau dẫn đến thực thi tối ưu hơn. Mỗi đối tượng DataFrame đại diện cho một kế hoạch logic nhưng vì tính chất "lười biếng" của chúng, không có sự thực thi nào xảy ra cho đến khi người dùng gọi một "hoạt động đầu ra" cụ thể.


2
Nhân tiện, RDD cũng lười biếng.
kon psych

6

Vài cái nhìn sâu sắc từ quan điểm sử dụng, RDD so với DataFrame:

  1. RDD là tuyệt vời! vì chúng cho chúng ta tất cả sự linh hoạt để đối phó với hầu hết mọi loại dữ liệu; dữ liệu phi cấu trúc, bán cấu trúc và cấu trúc. Vì, rất nhiều lần dữ liệu chưa sẵn sàng để phù hợp với DataFrame, (thậm chí JSON), RDD có thể được sử dụng để xử lý trước dữ liệu để có thể phù hợp với khung dữ liệu. RDD là sự trừu tượng hóa dữ liệu cốt lõi trong Spark.
  2. Không phải tất cả các phép biến đổi có thể có trên RDD đều có thể có trên DataFrames, ví dụ trừ () là cho RDD so với ngoại trừ () là cho DataFrame.
  3. Vì DataFrames giống như một bảng quan hệ, chúng tuân theo các quy tắc nghiêm ngặt khi sử dụng các phép biến đổi lý thuyết tập hợp / quan hệ, ví dụ nếu bạn muốn hợp nhất hai datafram thì yêu cầu là cả hai dfs đều có cùng số cột và kiểu dữ liệu cột liên quan. Tên cột có thể khác nhau. Các quy tắc này không áp dụng cho RDD. Dưới đây là một hướng dẫn tốt giải thích những sự thật này.
  4. Có hiệu suất tăng khi sử dụng DataFrames như những người khác đã giải thích sâu.
  5. Sử dụng DataFrames bạn không cần phải truyền hàm tùy ý như khi lập trình với RDD.
  6. Bạn cần SQLContext / HiveContext để lập trình các tệp dữ liệu khi chúng nằm trong khu vực SparkQuery của hệ sinh thái tia lửa, nhưng đối với RDD, bạn chỉ cần SparkContext / JavaSparkContext nằm trong các thư viện Spark Core.
  7. Bạn có thể tạo một df từ RDD nếu bạn có thể xác định một lược đồ cho nó.
  8. Bạn cũng có thể chuyển đổi một df thành rdd và rdd thành df.

Tôi hy vọng nó sẽ giúp!


5

Dataframe là một RDD của các đối tượng Row, mỗi đối tượng biểu thị một bản ghi. Một Dataframe cũng biết lược đồ (nghĩa là các trường dữ liệu) của các hàng của nó. Trong khi Datafram trông giống như RDD thông thường, bên trong chúng lưu trữ dữ liệu theo cách hiệu quả hơn, tận dụng lược đồ của chúng. Ngoài ra, họ cung cấp các hoạt động mới không có sẵn trên RDD, chẳng hạn như khả năng chạy các truy vấn SQL. Dữ liệu có thể được tạo từ các nguồn dữ liệu ngoài, từ kết quả của các truy vấn hoặc từ RDD thông thường.

Tham khảo: Zaharia M., et al. Học Spark (O'Reilly, 2015)


1

Spark RDD (resilient distributed dataset) :

RDD là API trừu tượng hóa dữ liệu cốt lõi và có sẵn kể từ lần phát hành đầu tiên của Spark (Spark 1.0). Nó là một API cấp thấp hơn để thao tác thu thập dữ liệu phân tán. API RDD trưng bày một số phương thức cực kỳ hữu ích có thể được sử dụng để kiểm soát rất chặt chẽ cấu trúc dữ liệu vật lý cơ bản. Nó là một tập hợp bất biến (chỉ đọc) các dữ liệu được phân vùng được phân phối trên các máy khác nhau. RDD cho phép tính toán trong bộ nhớ trên các cụm lớn để tăng tốc xử lý dữ liệu lớn theo cách chịu lỗi. Để kích hoạt khả năng chịu lỗi, RDD sử dụng DAG (Directed Acyclic Graph) bao gồm một tập hợp các đỉnh và cạnh. Các đỉnh và cạnh trong DAG đại diện cho RDD và thao tác được áp dụng trên RDD đó tương ứng. Các biến đổi được định nghĩa trên RDD là lười biếng và chỉ thực hiện khi một hành động được gọi

Spark DataFrame :

Spark 1.3 đã giới thiệu hai API trừu tượng hóa dữ liệu mới - DataFrame và Dataset. API DataFrame tổ chức dữ liệu thành các cột được đặt tên như bảng trong cơ sở dữ liệu quan hệ. Nó cho phép các lập trình viên xác định lược đồ trên một bộ sưu tập dữ liệu phân tán. Mỗi hàng trong DataFrame là hàng loại đối tượng. Giống như bảng SQL, mỗi cột phải có cùng số lượng hàng trong Khung dữ liệu. Nói tóm lại, DataFrame là kế hoạch được đánh giá một cách lười biếng trong đó chỉ định các hoạt động cần được thực hiện trên bộ sưu tập dữ liệu phân tán. DataFrame cũng là một bộ sưu tập bất biến.

Spark DataSet :

Là một phần mở rộng cho API DataFrame, Spark 1.3 cũng đã giới thiệu API Dataset cung cấp giao diện lập trình hướng đối tượng và gõ chính xác trong Spark. Nó là bộ sưu tập dữ liệu phân tán an toàn, bất biến. Giống như DataFrame, API Dataset cũng sử dụng công cụ Catalyst để cho phép tối ưu hóa thực thi. Bộ dữ liệu là một phần mở rộng cho API DataFrame.

Other Differences -

nhập mô tả hình ảnh ở đây


0

Một DataFrame là một RDD mà có một giản đồ. Bạn có thể nghĩ về nó như một bảng cơ sở dữ liệu quan hệ, trong đó mỗi cột có một tên và một loại đã biết. Sức mạnh của DataFrames đến từ thực tế là, khi bạn tạo DataFrame từ bộ dữ liệu có cấu trúc (Json, Parquet ..), Spark có thể suy ra một lược đồ bằng cách chuyển qua toàn bộ tập dữ liệu (Json, Parquet ..) đang được tải Sau đó, khi tính toán kế hoạch thực hiện, Spark, có thể sử dụng lược đồ và thực hiện tối ưu hóa tính toán tốt hơn đáng kể. Lưu ý rằng DataFrame được gọi là SchemaRDD trước Spark v1.3.0


0

Apache Spark - RDD, DataFrame và Dataset

Spark RDD -

Một RDD là viết tắt của Bộ dữ liệu phân tán linh hoạt. Đây là bộ sưu tập phân vùng chỉ đọc các bản ghi. RDD là cấu trúc dữ liệu cơ bản của Spark. Nó cho phép một lập trình viên thực hiện các tính toán trong bộ nhớ trên các cụm lớn theo cách chịu lỗi. Do đó, tăng tốc nhiệm vụ.

Spark Dataframe -

Không giống như RDD, dữ liệu được sắp xếp thành các cột được đặt tên. Ví dụ một bảng trong cơ sở dữ liệu quan hệ. Nó là một bộ sưu tập dữ liệu phân tán bất biến. DataFrame trong Spark cho phép các nhà phát triển áp đặt một cấu trúc lên một bộ sưu tập dữ liệu phân tán, cho phép trừu tượng hóa ở mức cao hơn.

Bộ dữ liệu Spark -

Các bộ dữ liệu trong Apache Spark là một phần mở rộng của API DataFrame cung cấp giao diện lập trình hướng đối tượng, an toàn kiểu. Bộ dữ liệu tận dụng lợi thế của trình tối ưu hóa Catalyst của Spark bằng cách hiển thị các biểu thức và trường dữ liệu cho trình hoạch định truy vấn.


-1

Bạn có thể sử dụng RDD với Cấu trúc và không cấu trúc trong đó vì Dataframe / Bộ dữ liệu chỉ có thể xử lý Dữ liệu có cấu trúc và bán cấu trúc (Nó có lược đồ phù hợp)


-2

Tất cả câu trả lời tuyệt vời và sử dụng mỗi API có một số đánh đổi. Bộ dữ liệu được xây dựng để trở thành siêu API để giải quyết nhiều vấn đề nhưng nhiều lần RDD vẫn hoạt động tốt nhất nếu bạn hiểu dữ liệu của mình và nếu thuật toán xử lý được tối ưu hóa để thực hiện nhiều việc trong một lần chuyển sang dữ liệu lớn thì RDD dường như là lựa chọn tốt nhất.

Tập hợp sử dụng API tập dữ liệu vẫn tiêu thụ bộ nhớ và sẽ tốt hơn theo thời gian.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.