SparkSQL之创建DataFrame

def main(args: Array[String]): Unit = {
  val conf = new SparkConf().setMaster("local").setAppName("ScalaDataFrame")
  val sc = new SparkContext(conf)
  val sqlContext = new SQLContext(sc)
  val listRDD = sc.parallelize(List("zhangsan 13 168.5", "lisi 14 175.3", "wangwu 15 176.3"))

  //    createDataFrame_1(listRDD, sqlContext)
  //    createDataFrame_2(listRDD, sqlContext)
  //    createDataFrame_3(listRDD, sqlContext)
  createDataFrame_4(listRDD, sqlContext)
  sc.stop()
}

/**
  * 将一个DataFrame注册成为一张临时表,在临时表上面执行sql的操作,方便我们的查询等操作
  */
def createDataFrame_4(listRDD: RDD[String], sqlContext: SQLContext) = {
  /**
    * 因为我们要使用sql的方式来操作SparkSQL对应的DataFrame
    * 应该把该DataFrame转化成为一张表,所以需要注册该DataFrame成为系统中的一张临时表
    */
  val df = createDataFrame_3(listRDD, sqlContext)
  df.registerTempTable("person")
  /**
    * 注册成为一张临时表之后,直接进行sql的操作,
    * 使用SQLContext,而不是df进行操作
    */

  val sqlDF = sqlContext.sql("select name, age, height from person where age > 14")
  sqlDF.show()
}

/**
  * 使用SQLContext的隐士转化快速将一个RDD转化为一个DataFrame
  */
def createDataFrame_3(listRDD: RDD[String], sqlContext: SQLContext): DataFrame = {
  import sqlContext.implicits._
  //这个隐士转换必须要有
  val rowRDD = listRDD.map(line => {
    val splits = line.split(" ")
    val name = splits(0).trim
    val age = splits(1).trim.toInt
    val height = splits(2).trim.toDouble
    (name, age, height)
  })
  /**
    * 第三中创建DataFrame的方式,使用sqlContext内部的一个隐士转换,
    * 增强普通RDD的功能
    * rdd.toDF(cols:String*)
    * col是对该rdd中所包含的数据的一个说明,简单认为就是转化为DataFrame之后给每个列
    * 起的一个列名
    */
  val df = rowRDD.toDF("name", "age", "height")
  //    df.printSchema()
  //    df.show()
  df
}

def createDataFrame_2(listRDD: RDD[String], sqlContext: SQLContext): Unit = {
  val personRDD: RDD[Person] = listRDD.map(line => {
    val splits = line.split(" ")
    val name = splits(0).trim
    val age = splits(1).trim.toInt
    val height = splits(2).trim.toDouble
    new Person(name, age, height)
  })

  /**
    * scala中通过反射的方式将一个RDD,转换为一个DataFrame
    * java中获取一个类的字节码Class对象,直接类名.class
    * scala中需要通过classOf[类名]的方法
    */
  val df = sqlContext.createDataFrame(personRDD, classOf[Person])
  df.printSchema()

  df.show()
}

/**
  * 在代码中动态生成DataFrame
  */
def createDataFrame_1(listRDD: RDD[String], sqlContext: SQLContext): Unit = {
  //---->RDD---->DataFrame来进行一个操作
  val rowRDD: RDD[Row] = listRDD.map(line => {
    val splits = line.split(" ")
    val name = splits(0).trim
    val age = splits(1).trim.toInt
    val height = splits(2).trim.toDouble
    Row(name, age, height)
  })
  //通过动态编码的方式
  val structType = StructType(Array(
    StructField("name", DataTypes.StringType, true),
    StructField("age", DataTypes.IntegerType, true),
    StructField("height", DataTypes.DoubleType, true)
  ))
  val df = sqlContext.createDataFrame(rowRDD, structType)
  df.show()
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值