ITPub博客

首页 > 大数据 > Spark > Spark SQL中的RDD与DataFrame转换

Spark SQL中的RDD与DataFrame转换

原创 Spark 作者:yunqiublog 时间:2019-08-12 14:18:42 0 删除 编辑

一.第一种方式RDD转化为DataFrame

1.官网

2.解释


反射
把schema信息全部定义在case class 类里面

3.代码


package core
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.StructType
object Test {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder()
      .appName("Test")
      .master("local[2]")
      .getOrCreate()
    val mess = spark.sparkContext.textFile("file:///D:\\test\\person.txt")
    import spark.implicits._
    val result = mess.map(_.split(",")).map(x => Info(x(0).toInt,x(1),x(2).toInt)).toDF()
   // result.map(x => x(0)).show() //在1.x 版本是可以的 在2.x不可以需要价格rdd
    result.rdd.map(x => x(0)).collect().foreach(println)
    result.rdd.map(x => x.getAs[Int]("id")).collect().foreach(println)
  }
}
case class Info(id:Int,name:String,age:Int)

4.注意事项


注意2.2版本以前 类的构造方法参数有限
在2.2后没有限制了

二.第二种转换方式

1.官网

2.解释


制定scheme信息 就是编程的方式   作用到Row 上面

3.步骤

4.步骤解释


从原有的RDD转化 ,类似于textFile
一个StructType匹配Row里面的数据结构(几列),就是几个StructField 
通过createDataFrame  把schema与RDD关联上

5.源码解释StructType

6.源码解释


StructField 可以理解为一列
StructType  包含  1-n 个StructField

7.最终代码


package core
import org.apache.spark.sql.types.{IntegerType, StringType, StructField, StructType}
import org.apache.spark.sql.{Row, SparkSession}
object TestRDD2 {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder()
      .appName("TestRDD2")
      .master("local[2]")
      .getOrCreate()
    val mess = spark.sparkContext.textFile("file:///D:\\test\\person.txt")
    val result = mess.map(_.split(",")).map(x => Row(x(0).toInt, x(1), x(2).toInt))
    //工作中这样写
    val structType = new StructType(
      Array(
          StructField("id", IntegerType, true),
          StructField("name", StringType, true),
          StructField("age", IntegerType, true)
      )
    )
    val schema = StructType(structType)
    val info = spark.createDataFrame(result,schema)
    info.show()
  }
}

8.经典错误

9.原因解决


自己定义的schema信息与Row中的信息不匹配
val result = mess.map(_.split(",")).map(x => Row(x(0), x(1), x(2)))
//工作中这样写
val structType = new StructType(
  Array(
      StructField("id", IntegerType, true),
      StructField("name", StringType, true),
      StructField("age", IntegerType, true)
  )
)
上面的是string 要的是int ,一定要注意因为会经常出错要转化类型
val result = mess.map(_.split(",")).map(x => Row(x(0).toInt, x(1), x(2).toInt))

三.方法的使用

1.spark-shell 有的方法在代码要自己隐士砖换


df.select('name).show  这个在spark-shell 可以
或者df.select('name').show 
但是代码里面不行,需要隐士转

2.show源码


show源码  默认是true  显示小于等于20条,对应行中的字符
是false就全部显示出来
show(30,false)   也是全部显示出来不会截断
show(5)  但是后面的多与20字符就不会显示
你可以show(5,false)

3.select方法源码

4.select 方法调用走的位置


df.select("name").show(false)
import spark.implicits._
//这样不隐士转换不行
df.select('name).show(false)
df.select($"name")
第一个select走的底层源码是 第一个源码图
2,3个select走的源码是第二个

5.head源码


head 默认调第一条,你想展示几条就调几条

6.first() 展示第一条 底层调用的是head

7.sort源码


sort源码默认升序
降序解释中有

四.sql的操作方法

1.官网临时试图

2.全局试图操作


全局视图加上  global_temp 规定

五.杂项

1.报错

2.原因及代码


 val spark = SparkSession.builder()
   .appName("Test")
   .master("local[2]")
   .getOrCreate()
 val mess = spark.sparkContext.textFile("file:///D:\\test\\person.txt")
 import spark.implicits._
 val result = mess.map(_.split(",")).map(x => Info(x(0).toInt,x(1),x(2).toInt)).toDF()
 //在1.x 版本是可以的 在2.x不可以需要价格rdd
 result.map(x => x(0)).show() 
 这样写是对的
 result.rdd.map(x => x(0)).collect().foreach(println)
 去类中的数据两种写法:
 result.rdd.map(x => x(0)).collect().foreach(println)
result.rdd.map(x => x.getAs[Int]("id")).collect().foreach(println)

3.注意转义字符


对于分隔符 |   你切分一定要加转义字符,否则数据不对

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69941978/viewspace-2653388/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
不怂就是干

注册时间:2019-07-22

  • 博文量
    14
  • 访问量
    5215