通过反射推断Schema

本文介绍了如何借助反射来推断包含特定对象类型的RDD的模式(schema),特别是在已知模式的情况下,反射可以使Spark程序的代码更为简洁。通过反射获取的对象属性将作为SchemaRDD的列名,并可进一步注册为表格,以便在后续的SQL查询中使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用反射来推断包含特定对象类型的RDD的模式(schema)。适用于写spark程序的同时,已经知道了模式,使用反射可以使得代码简洁。结合样本的名字,通过反射读取,作为列的名字。这个RDD可以隐式转化为一个SchemaRDD,然后注册为一个表。表可以在后续的sql语句中使用。


代码实现:

package com.wl.spark

import org.apache.spark.rdd.RDD
import org.apache.spark.sql.{DataFrame, SQLContext}
import org.apache.spark.{SparkConf, SparkContext}

/**
  * desc:
  *     通过反射来推断Schema
  *     使用反射来推断包含特定对象类型的RDD的模式(schema)。
  * Created by anmoFree on 2018/4/7  
  */
class GenerateDFByClass {

}

object GenerateDFByClass{
  def main(args: Array[String]): Unit = {
    //创建SparkConf()并设置App名称和运行模式
    val conf = new SparkConf().setAppName("GenerateDFByClass")
      .setMaster("local")

    // //SQLContext要依赖SparkContext
    val sc = new SparkContext(conf)

    // 创建SparkSql
    val sqlContext = new SQLContext(sc);

    // 从指定文件创建RDD
    // 文件的每一行作为一个元组,组成元组的集合即为RDD
    val fileRDD: RDD[String] = sc.textFile("F:/stu.txt")
//    println(fileRDD.collect().toBuffer)
//    打印结果
//    ArrayBuffer(101 tom 98, 102 jack 78, 103 lolo 80, 104 mark 67, 105 mary 88, 106 henry 89, 107 koko 70)
//    println(fileRDD.foreach(x => println(x)))
    /*
    打印结果:
    101 tom 98
    102 jack 78
    103 lolo 80
    104 mark 67
    105 mary 88
    106 henry 89
    107 koko 70
     */

    // 切分数据
    val lineRDD: RDD[Array[String]] = fileRDD.map(_.split(" "))

    //  创建case class
    //  将RDD和case class 关联
    val stuRDD: RDD[Student] = lineRDD.map(x => Student(x(0).toInt, x(1), x(2).toInt))

    // 导入隐式转换, 如果不导入无法将RDD转换为DataFrame
    // 将RDD转换为DataFrame
    import sqlContext.implicits._
    val stuDF: DataFrame = stuRDD.toDF

    // 将DataFrame注册为临时表
    stuDF.registerTempTable("t_student")

    // 对临时表进行操作
    val df: DataFrame = sqlContext.sql("select * from t_student order by scores desc limit 2")

    // 将结果以JSON的方式存储到指定文件夹
//    df.write.json("F:/IO.txt")
    /*
    错误1:Exception in thread "main" org.apache.spark.sql.AnalysisException: path file:/F:/IO.txt already exists.;
    F:/IO.txt 文件已存在   并且此处应该填写文件夹,会自动创建此文件夹并在文件夹下创建文件
     */
    df.write.json("F:/result")
    /*
    结果:
    {"id":101,"name":"tom","scores":98}
    {"id":106,"name":"henry","scores":89}
     */

    // 停止Spark Context
    sc.stop()
  }
}

// case class一定要放在伴生对象object外面
case class Student(id: Int, name: String, scores: Int)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值