2016-04-20 19 views
18

Nếu tôi muốn tạo StructType (ví dụ: DataFrame.schema) trong số case class, có cách nào để thực hiện điều đó mà không cần tạo DataFrame không? Tôi có thể dễ dàng thực hiện:Tạo Sơ đồ/Cấu trúc Spark từ lớp vỏ

case class TestCase(id: Long) 
val schema = Seq[TestCase]().toDF.schema 

Nhưng có vẻ như quá mức cần thiết để tạo ra DataFrame khi tất cả những gì tôi muốn là lược đồ.

(Nếu bạn tò mò, lý do đằng sau những câu hỏi là tôi đang xác định một UserDefinedAggregateFunction, và làm như vậy bạn ghi đè một vài phương pháp mà trở StructTypes và tôi sử dụng lớp hợp cụ thể.)

Trả lời

28

Bạn có thể làm nó theo cùng một cách SQLContext.createDataFrame làm nó:

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

Cảm ơn - đã không hoàn toàn đã làm cho nó thành 'o.a.s.sql.catalyst' được nêu ra. Và tôi đã nghĩ thẳng tôi đã bắt đầu với 'createDataFrame' giống như bạn đã làm. ':-(' –

+0

Ngọt ngào, bạn thậm chí có thể làm '... schemaFor [(Long, Int, Long)] ...' –

+0

Đừng lo - Tôi chỉ tìm thấy nó dễ dàng bởi vì tôi đã thử một cái gì đó tương tự như bản thân mình trong khi trước đây ;) Và có - sẽ làm việc cho bất kỳ 'Sản phẩm', cảm ơn bạn Scala! –

27

tôi biết câu hỏi này là gần một năm tuổi nhưng tôi đi qua nó và nghĩ rằng những người khác làm cũng có thể muốn biết rằng tôi vừa học được cách sử dụng phương pháp này:

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

Hãy nhận biết - đối tượng' Encoder 'được gắn cờ với chú thích '@ Experimental':" API thử nghiệm hướng đến người dùng. API thử nghiệm có thể thay đổi hoặc bị xóa ở vị trí nhỏ các phiên bản Spark, hoặc được chấp nhận là API Spark hạng nhất. " Phát hiện ra rằng trong một nỗ lực để tìm ra ưu/nhược điểm của các cách tiếp cận khác nhau (câu trả lời hiện tại và câu trả lời được chấp nhận.) –

2

trong trường hợp ai đó muốn làm việc này cho một tùy chỉnh chương trình Java:

ExpressionEncoder.javaBean(Event.class).schema().json() 
+1

Còn có '' 'Encoders.bean (Event.class) .schema()' '' mà tôi giả định cũng làm như vậy . –

Các vấn đề liên quan