日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Spark SQL(四)之DataSet与RDD转换

發布時間:2023/12/3 数据库 68 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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?。

  • Row從原始RDD創建一個的RDD;
  • 在第1步中創建的RDD中創建StructType與Rows的結構匹配?表示的模式。
  • Row通過通過createDataFrame提供的方法將架構應用于的RDD?SparkSession。
  • JavaRDD<String> manRDD = ... String cols = "name,desc"; List<StructField> fields = new LinkedList<>(); for (String fieldName : cols.split(",")) {StructField field = DataTypes.createStructField(fieldName, DataTypes.StringType, true);fields.add(field); } StructType schema = DataTypes.createStructType(fields); JavaRDD<Row> rowRDD = manRDD.map((Function<String, Row>) record -> {String[] splits = record.split(",");return RowFactory.create(splits[0], splits[1].trim()); });Dataset<Row> manDataFrame = spark.createDataFrame(rowRDD, schema);

    ?

    三、DataSet轉RDD

    ?toJavaRDD方法直接將DataSet轉RDD

    JavaRDD<Row> javaRDD = df.toJavaRDD();

    ?

    總結

    以上是生活随笔為你收集整理的Spark SQL(四)之DataSet与RDD转换的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。