码迷,mamicode.com
首页 > 其他好文 > 详细

045 RDD与DataFrame互相转换

时间:2018-07-28 23:26:43      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:不能   scala   图片   反射   transform   pat   关于   ack   type   

一:RDD与DataFrame互相转换

1.总纲

  技术分享图片

 

二:DataFrame转换为RDD

1.rdd

  使用schema可以获取DataFrame的schema

  使用rdd可以获取DataFrame的数据

 

三:RDD转换为DataFrame

1.第一种方式

  使用反射,

  RDD的数据类型必须是case class。

 1     import sqlContext.implicits._                //如果不写,下面的转换不成功
 2 
 3     //transform
 4     val path="/spark/logs/input"
 5     val rdd=sc.textFile(path)
 6     val apacheAccessDataFrame=rdd
 7       .filter(line=>ApacheAccessLog.isValidateLogLine(line))
 8       .map(line => {
 9         ApacheAccessLog.parseLogLine(line)
10     }).toDF()                                    //rdd转换为DataFrame

  其中,ApacheAccessLog.parseLogLine(line)是case class类型。

 

2:第二种方式

 1 package com.scala.it
 2 import org.apache.spark.rdd.RDD
 3 import org.apache.spark.sql.types._
 4 import org.apache.spark.sql.{Row, SQLContext}
 5 import org.apache.spark.{SparkConf, SparkContext}
 6 object CreateDataFrameDemo {
 7   def main(args: Array[String]): Unit = {
 8     val conf = new SparkConf()
 9       .setMaster("local[*]")
10       .setAppName("hive-join-mysql")
11     // 使用kryo序列化机制
12     conf.registerKryoClasses(Array(classOf[Row], classOf[Tuple3[Int, String, Double]]))
13     val sc = SparkContext.getOrCreate(conf)
14 
15     val sqlContext = new SQLContext(sc)
16 
17     // ===================================
18     // RDD中Row中的各个列的类型必须是一致的(不能有歧义)
19     val rdd: RDD[Row] = sc.parallelize(Array(
20       (1, "Tom", 1234.1),
21       (2, "Lili", 12532.2),
22       (3, "Gerry", 123.0)
23     )).map {
24       case (id, name, salary) => {
25         Row(id, name, salary)
26       }
27     }
28     val schema: StructType = StructType(Array(
29       StructField("id", IntegerType),
30       StructField("name", StringType),
31       StructField("salary", DoubleType)
32     ))
33 
34     val df = sqlContext.createDataFrame(rdd, schema)
35     df.show()
36   }
37 }

 

3.解释上面的程序

  产生RDD有两种方式,读取数据源,或者序列化

  这里使用序列化产生RDD。

  -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  关于rdd中为什么要使用Row:

  技术分享图片

  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  关于StructType:

  技术分享图片

  -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  关于StructField:

    其中,后两个是默认参数,可以不给。

  技术分享图片

 

 

  

 

045 RDD与DataFrame互相转换

标签:不能   scala   图片   反射   transform   pat   关于   ack   type   

原文地址:https://www.cnblogs.com/juncaoit/p/9383719.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!