Spark SQL(四)之DataSet与RDD转换
一、創建DataSet
DataSet與RDD相似,但是,它們不使用Java序列化或Kryo,而是使用專用的Encoder對對象進行序列化以進行網絡處理或傳輸。雖然編碼器和標準序列化都負責將對象轉換為字節,但是編碼器是動態生成的代碼,并使用一種格式,該格式允許Spark執行許多操作,例如過濾,排序和哈希處理,而無需將字節反序列化回對象。
Encoder<Man> manEncoder = Encoders.bean(Man.class); Dataset<Man> manDS = spark.createDataset(Collections.singletonList(man),manEncoder );Encoder<String> strEncoder = Encoders.STRING(); Dataset<String> strDS = spark.createDataset(Arrays.asList("a", "b", "c"), strEncoder);?
二、RDD轉DataSet
Spark SQL支持兩種將現有RDD轉換為數據集的方法。第一種方法使用反射來推斷包含特定對象類型的RDD的架構。這種基于反射的方法可以使代碼更簡潔,并且在編寫Spark應用程序時已經了解架構時可以很好地工作。
創建數據集的第二種方法是通過編程界面,該界面允許您構造模式,然后將其應用于現有的RDD。盡管此方法較為冗長,但可以在運行時才知道列及其類型的情況下構造數據集。
(1)使用反射推斷表的模式
Spark SQL支持自動將JavaBean的RDD 轉換為DataFrame,使用反射得到Bean信息,定義了表的模式。Spark SQL不支持包含Map字段的JavaBean 。 不過,支持嵌套JavaBean和List或Array字段。
可以通過創建一個實現Serializable并為其所有字段具有getter和setter的類來創建JavaBean。
JavaRDD<Man> manRDD = spark.read().textFile("/test.txt").javaRDD().map(line -> {String[] splits = line.split(",");Man man = new Man();man.setName(splits[0]);man.setDesc(splits[1]);return man;});Dataset<Row> manDF = spark.createDataFrame(manRDD, Man.class);?(2)以編程方式指定架構
當無法提前定義JavaBean類時(例如,記錄的結構編碼為字符串,或者將解析文本數據集,并且為不同的用戶設計不同的字段),Dataset<Row>可以通過三個步驟以編程方式創建a?。
?
三、DataSet轉RDD
?toJavaRDD方法直接將DataSet轉RDD
JavaRDD<Row> javaRDD = df.toJavaRDD();?
總結
以上是生活随笔為你收集整理的Spark SQL(四)之DataSet与RDD转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spark SQL(三)之视图与执行SQ
- 下一篇: Spark SQL(五)之数据加载与存储