RDD与DataFrame转换
1. 通过反射的方式来推断RDD元素中的元数据。因为RDD本身一条数据本身是没有元数据的,例如Person,而Person有name,id等,而record是不知道这些的,但是变成DataFrame背后一定知道,通过反射的方式就可以了解到背后这些元数据,进而转换成DataFrame。
如何反射?
Scala: 通过case class映射,在case class里面说我们这个RDD里面每个record的不同列的元数据是什么。(废弃)
当样本类不能提前确定时(例如,当记录的结构由字符串或文本数据集编码而成,它在解析时,字段将会对不同的用户有不同的投影结果),SchemaRDD 可以由以下三个步骤创建:
当JavaBean不能被预先定义的时候,编程创建DataFrame分为三步:

 //   从原来的RDD创建一个Row格式的RDD
 //    创建与RDD 中Rows结构匹配的StructType,通过该StructType创建表示RDD 的Schema
 //   通过SQLContext提供的createDataFrame方法创建DataFrame,方法参数为RDD 的Schema
val conf = new SparkConf().setMaster ("local").setAppName ("Test1")
val sc = new SparkContext (conf)
val sqlContext = new SQLContext(sc)
// import sqlContext.implicits._ case class Person(name:String,age:Int)
val people = sc.textFile ("d:/people.txt")
val schemaString = "name age"
val schema = StructType (
schemaString.split(" ").map(fieldName => StructField(fieldName,StringType,true))
)
val rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim))
val peopleSchemaRDD = sqlContext.createDataFrame(rowRDD, schema)
peopleSchemaRDD .registerTempTable("people" )
val results = sqlContext . sql ("SELECT name FROM people" )
results.printSchema()
println(results.count())
results.map(t => "Name: " + t(0)).collect().foreach(println)

//1.利用反射来推断包含特定类型对象的RDD的schema。这种方法会简化代码并且在你已经知道schema的时候非常适用。

//2.   先创建一个bean类,然后将Rdd转换成DataFrame
case class Person(name: String, age: Int)
def main (args : Array[String]) : Unit =
{
val conf = new SparkConf().setMaster ("local").setAppName ("Test1")
val sc = new SparkContext (conf)
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._ val people = sc.textFile("d:/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()
people.registerTempTable("people")
val teenagers = sqlContext.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19")
teenagers.map(t => "Name: " + t(0)).collect().foreach(println)
teenagers.map(t => "Name: " + t.getAs[String]("name")).collect().foreach(println)
teenagers.map(_.getValuesMap[Any](List("name", "age"))).collect().foreach(println)

最新文章

  1. 使用PhoneGap开启移动开发之旅
  2. Swift设置自动行高
  3. 十五天精通WCF——第十三天 用WCF来玩Rest
  4. [Bootstrap]7天深入Bootstrap(2)整体架构
  5. hibernate关于一对一用法
  6. 直接查数据导出xls
  7. hdu 2715 Herd Sums
  8. 【学习笔记】【oc】copy与mutableCopy
  9. NETTY 编码器介绍
  10. Qt同步线程(比较清楚,而且QMutex QMutexLocker QReadWriteLock QSemaphore QWaitCondition 每个都有例子)
  11. OpenGL中shader读取实现
  12. Installation error: INSTALL_FAILED_UID_CHANGED 的解决办法
  13. 用stm32f0x建立新的工程重要步骤
  14. (一一七)基本文件操作 -SDWebImage清除缓存 -文件夹的大小计算
  15. Wpf ViewModel中 ObservableCollection不支持从调度程序线程以外的线程对其 SourceCollection 进行的更改
  16. Linux命令第一篇
  17. 使用PLC作为payload/shellcode分发系统
  18. android TextView Unicde编码转换 android中一些特殊字符Unicode码值
  19. excel的宏与VBA入门(一)——基础概念
  20. hihoCoder #1190 : 连通性&#183;四(点的双连通分量模板)

热门文章

  1. C# 写的一个生成随机汉语名字的小程序
  2. 使用Mulesoft建立webservice, jax-ws方式, wsdl first
  3. 横向滑动的GridView
  4. 移动端div移动
  5. goldengate studio 12.2.1.2.6发布
  6. .net dataGridView当鼠标经过时当前行背景色变色;然后【给GridView增加单击行事件,并获取单击行的数据填充到页面中的控件中】
  7. iscroll修改
  8. Android深度探索--HAL与驱动开发----第二章读书笔记
  9. Android深度探索--HAL与驱动开发----第一章读书笔记
  10. CxImage在VS2010下的配置