资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

SparkSQL中的RDD与DataFrame转换实例用法

这篇文章主要讲解了“Spark SQL中的RDD与DataFrame转换实例用法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spark SQL中的RDD与DataFrame转换实例用法”吧!

为可克达拉等地区用户提供了全套网页设计制作服务,及可克达拉网站建设行业解决方案。主营业务为网站制作、网站设计、可克达拉网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

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

1.官网

Spark SQL中的RDD与DataFrame转换实例用法

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后没有限制了

Spark SQL中的RDD与DataFrame转换实例用法

二.第二种转换方式

1.官网

Spark SQL中的RDD与DataFrame转换实例用法

2.解释

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

3.步骤

Spark SQL中的RDD与DataFrame转换实例用法

4.步骤解释

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

5.源码解释StructType

Spark SQL中的RDD与DataFrame转换实例用法

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.经典错误

Spark SQL中的RDD与DataFrame转换实例用法

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)

Spark SQL中的RDD与DataFrame转换实例用法

Spark SQL中的RDD与DataFrame转换实例用法

3.select方法源码

Spark SQL中的RDD与DataFrame转换实例用法

Spark SQL中的RDD与DataFrame转换实例用法

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 默认调第一条,你想展示几条就调几条

Spark SQL中的RDD与DataFrame转换实例用法

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

Spark SQL中的RDD与DataFrame转换实例用法

7.sort源码

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

Spark SQL中的RDD与DataFrame转换实例用法

四.sql的操作方法

1.官网临时试图

Spark SQL中的RDD与DataFrame转换实例用法

2.全局试图操作

全局视图加上  global_temp 规定

Spark SQL中的RDD与DataFrame转换实例用法

五.杂项

1.报错

Spark SQL中的RDD与DataFrame转换实例用法

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.注意转义字符

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

感谢各位的阅读,以上就是“Spark SQL中的RDD与DataFrame转换实例用法”的内容了,经过本文的学习后,相信大家对Spark SQL中的RDD与DataFrame转换实例用法这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


本文题目:SparkSQL中的RDD与DataFrame转换实例用法
分享链接:http://cdkjz.cn/article/ghcppe.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220