2016-01-22 27 views
5

Ví dụ, giả sử tôi có DataFrame:Apache Spark: Làm cách nào để chuyển đổi một khung dữ liệu Spark thành RDD với loại RDD [(Type1, Type2, ...)]?

var myDF = sc.parallelize(Seq(("one",1),("two",2),("three",3))).toDF("a", "b") 

tôi có thể chuyển nó sang một RDD[(String, Int)] với một bản đồ:

var myRDD = myDF.map(r => (r(0).asInstanceOf[String], r(1).asInstanceOf[Int])) 

Có cách nào tốt hơn để làm điều này, có thể sử dụng sơ đồ DF ?

Trả lời

8

Sử dụng phù hợp với mô hình trên :

import org.apache.spark.sql.Row 

myDF.map{case Row(a: String, b: Int) => (a, b)} 

Trong Spark 1.6 + bạn có thể sử dụng Dataset như sau:

myDF.as[(String, Int)].rdd 
+2

Ooh, mà 'as' chức năng là hoàn hảo. –

+0

Vì vậy, mô hình của bạn sẽ khớp với 'Row' nhanh hơn hoặc an toàn hơn bản đồ' asInstanceOf' của tôi? Hay nó đun sôi xuống một hoạt động khá giống với cú pháp sạch hơn? –

+0

Tùy chọn thứ hai tôi sợ. 'Row' (và' DataFrame' nói chung) là khá khó chịu khi nói đến gõ tĩnh. Sử dụng 'Dataset' sẽ hiệu quả hơn nhiều, đặc biệt nếu bạn không chuyển đổi sang RDD. – zero323

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