Spark:rddをデータフレームに変換し、3つの方法でフィールド名を追加します

目的: rddをデータフレームに変換し、フィールド名を指定します

以下は、実例を示すための実際的な例です。
読み取られたデータは次のとおりですstudent_info.txt

学生証 名前 性別 クラス 入学日
170401011001,施礼义,男,0101,20170901
170401011002,王旭,男,0101,20170901
170401011003,肖桢,女,0101,20170901
170401011004,吴佩东,男,0101,20170901
170401011005,魏会,男,0101,20170901
170401011006,曾美,女,0101,20170901
170401011007,邵亚,女,0101,20170901
170401011008,朱燕菊,女,0101,20170901
170401011009,杨明书,男,0101,20170901
170401011010,张伟,男,0101,20170901

コード

package com.zbw.spark

import org.apache.spark.sql.types.{
    
    StringType, StructField, StructType}
import org.apache.spark.sql.{
    
    Row, SparkSession}
import org.apache.spark.{
    
    SparkConf, SparkContext}

object DataFrameTest {
    
    

    //样例类、方式三用到
  case class Student(userId: String, userName: String, sex: String, classID: String, date: String)
    
  def main(args: Array[String]): Unit = {
    
    
    val spark = SparkSession.builder()
      .config(new SparkConf()).
      appName("t1")
      .master("local[*]")
      .getOrCreate()

    val sc = spark.sparkContext

    import spark.implicits._

    //170401011001,施礼义,男,0101,20170901

    // 方式一: 指定列名添加Schema
    val rdd1 = sc.textFile("input/student_info.txt").
      map {
    
     x =>
        val fields = x.split(",")
        (fields(0), fields(1), fields(2), fields(3), fields(4))
      }

    rdd1.toDF("userID", "userName", "sex", "classID", "date").show()

    // 方式二: 通过StructType指定Schema
    val rdd2 = sc.textFile("input/student_info.txt")
    val rowRDD = rdd2.map(_.split(",")).map(x => Row(x(0), x(1), x(2), x(3), x(4)))

    val structType1: StructType = StructType(Seq(
      StructField("userID", StringType),
      StructField("userName", StringType),
      StructField("sex", StringType),
      StructField("classID", StringType),
      StructField("date", StringType)
    ))
    spark.createDataFrame(rowRDD, structType1).show()


    // 方式三 :编写样例类,利用反射机制推断Schema
    sc.textFile("input/student_info.txt")
      .map {
    
     x =>
        val fields = x.split(",")
        Student(fields(0), fields(1), fields(2), fields(3), fields(4))
      }.toDF().show()
  }
}

3つの方法すべてが出力されます。

+------------+--------+---+-------+--------+
|      userID|userName|sex|classID|    date|
+------------+--------+---+-------+--------+
|170401011001|     施礼义|  男|   0101|20170901|
|170401011002|      王旭|  男|   0101|20170901|
|170401011003|      肖桢|  女|   0101|20170901|
|170401011004|     吴佩东|  男|   0101|20170901|
|170401011005|      魏会|  男|   0101|20170901|
|170401011006|      曾美|  女|   0101|20170901|
|170401011007|      邵亚|  女|   0101|20170901|
|170401011008|     朱燕菊|  女|   0101|20170901|
|170401011009|     杨明书|  男|   0101|20170901|
|170401011010|      张伟|  男|   0101|20170901|
|170401011011|     张宁波|  男|   0102|20170901|
|170401011012|      石勇|  男|   0102|20170901|
|170401011013|      刘彬|  男|   0102|20170901|
|170401011014|     徐德海|  男|   0102|20170901|
|170401011015|      周涛|  女|   0102|20170901|
|170401011016|     周鹏琼|  女|   0102|20170901|
|170401011017|      刘硕|  男|   0102|20170901|
|170401011018|      黄城|  男|   0102|20170901|
|170401011019|      颜旺|  男|   0102|20170901|
|170401011020|      龙位|  男|   0102|20170901|
+------------+--------+---+-------+--------+

おすすめ

転載: blog.csdn.net/VariatioZbw/article/details/109391143