RDD->DF

原创 2018年04月16日 11:20:48

简介:
DataFrame是分布式数据和数据结构组成的组织集合,概念等同于关系型数据库里的表(dataframe.registerTempTable("tablename")注册内存表)。
DataFrame的API支持Scala,java,Python,R。
r4vrf
SQLContext:
SparkSQL的所有方法都在SQLContext类或它的子类里,用SparkContext创建一个SQLContext:
[plain] view plain copy
  1. val sc: SparkContext // An existing SparkContext.  
  2. val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
  3.   
  4. // 用来把RDD隐式转换为DF(DataFrame)  
  5. import sqlContext.implicits._  
也可以创建一个HiveContext,它是SQLContext的子集,额外提供了更完整的HiveQL解析器,Hive UDFs权限,并且可以直接读取Hive表的数据。
不需要重新配置Hive,原来的SQLContext使用的所有数据源HiveContext都可以直接使用。
也可以使用spark.sql.dialect 来配置SQL方言,sparkSQL里的参数只有一个"sql",即使用SparkSQL,而HiveContext则可以把默认的"hiveql"改为“sql”。

创建一个DataFrame:
通过SQLContxt,可以从一个以存在的RDD、Hive表或数据源创建DF。
例:scala
[plain] view plain copy
  1. val sc: SparkContext // An existing SparkContext.  
  2. val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
  3. val df = sqlContext.read.json("examples/src/main/resources/people.json")  
  4. // 显示字段和前五条数据  
  5. df.show(5)  

操作DataFrame:
例:scala
[plain] view plain copy
  1. val sc: SparkContext // An existing SparkContext.  
  2. val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
  3.   
  4. // 创建 DataFrame  
  5. val df = sqlContext.read.json("examples/src/main/resources/people.json")  
  6.   
  7. // 显示 DataFrame 的字段和所有数据  
  8. df.show()  
  9. // age  name  
  10. // null Michael  
  11. // 30   Andy  
  12. // 19   Justin  
  13.   
  14. // 显示df的schema(以树形结构显示)  
  15. df.printSchema()  
  16. // root  
  17. // |-- age: long (nullable = true)  
  18. // |-- name: string (nullable = true)  
  19.   
  20. // 只查询"name"字段  
  21. df.select("name").show()  
  22. // name  
  23. // Michael  
  24. // Andy  
  25. // Justin  
  26.   
  27. // 查询name,age+1  
  28. df.select(df("name"), df("age") + 1).show()  
  29. // name    (age + 1)  
  30. // Michael null  
  31. // Andy    31  
  32. // Justin  20  
  33.   
  34. // 查询年龄 > 21  
  35. df.filter(df("age") > 21).show()  
  36. // age name  
  37. // 30  Andy  
  38.   
  39. // Count people by age  
  40. df.groupBy("age").count().show()  
  41. // age  count  
  42. // null 1  
  43. // 19   1  
  44. // 30   1  
这里是DataFrame的完整官方API: DataFrame--API    DataFrame--函数引用

执行SQL:
SQLContext可以执行SQL并返回一个DataFrame:
[plain] view plain copy
  1. val sqlContext = ...  // An existing SQLContext  
  2. val df = sqlContext.sql("SELECT * FROM table")  

与RDD交互:
SparkSQL提供了两种方式把RDD转换为DataFrame
第一种通过反射(前提是知道schema),第二种通过提供的接口创建schema。
通过反射:
scala提供了一种通过case class把RDD转换为DataFrame,case clasee定义了表结构,通过反射的方式读取参数并转换为字段,case class也可以是嵌套的复杂序列或数组。这样RDD就可以隐式的转换为DataFrame,df再注册为内存表,就可以通过sql操作此表。
例:scala
[plain] view plain copy
  1. val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
  2. // 用来隐式转换 RDD 为  DataFrame.  
  3. import sqlContext.implicits._  
  4.   
  5. // 通过 case class 定义schema.  
  6. // Note: Case classes 在 Scala 2.10 只支持最多 22 字段. 可以自定义接口突破这个限制.  
  7. case class Person(name: String, age: Int)  
  8.   
  9. // 创建一个Person的RDD并注册成表.  
  10. val people = sc.textFile("examples/src/main/resources/people.txt").map(_.split(",")).map(p => Person(p(0), p(1).trim.toInt)).toDF()  
  11. people.registerTempTable("people")  
  12.   
  13. // 通过sqlContext执行SQL操作内存表.  
  14. val teenagers = sqlContext.sql("SELECT name, age FROM people WHERE age >= 13 AND age <= 19")  
  15.   
  16. // SQL的查询结果是DataFrame.  
[plain] view plain copy
  1. //字段可以通过下标来获得  
  2. teenagers.map(t => "Name: " + t(0)).collect().foreach(println)  
  3.   
  4. // 或用字段名:  
  5. teenagers.map(t => "Name: " + t.getAs[String]("name")).collect().foreach(println)  
  6.   
  7. \\
  8. teenagers.map(_.getValuesMap[Any](List("name", "age"))).collect().foreach(println)  
  9. // Map("name" -> "Justin", "age" -> 19)  
反射实例:

通过接口自定义schema:
当某些情况下case class不能提前定义时,就用这种方法,一般分三步:
1.通过原始RDD创建RDD的Rows
2.通过StructType匹配RowS里的结构创建schema
3.通过SQLContext提供的createDataFrame(row,schema)方法创建DataFrame
例:scala
[plain] view plain copy
  1. // sc is an existing SparkContext.  
  2. val sqlContext = new org.apache.spark.sql.SQLContext(sc)  
  3.   
  4. // 创建 RDD  
  5. val people = sc.textFile("examples/src/main/resources/people.txt")  
  6.   
  7. // The schema is encoded in a string  
  8. val schemaString = "name age"  
  9.   
  10. // Import Row.  
  11. import org.apache.spark.sql.Row;  
  12.   
  13. // Import Spark SQL data types  
  14. import org.apache.spark.sql.types.{StructType,StructField,StringType};  
  15.   
  16. // 通过接口定义schema  
  17. val schema =  
  18.   StructType(  
  19.     schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, true)))  
  20.   
  21. // 把RDD (people) 转换为 Rows.  
  22. val rowRDD = people.map(_.split(",")).map(p => Row(p(0), p(1).trim))  
  23.   
  24. // Apply the schema to the RDD.  
  25. val peopleDataFrame = sqlContext.createDataFrame(rowRDD, schema)  
  26.   
  27. // df注册内存表.  
  28. peopleDataFrame.registerTempTable("people")  
  29.   
  30. // sqlContext执行SQL返回结果df.  
  31. val results = sqlContext.sql("SELECT name FROM people")  
  32. <pre name="code" class="plain">// SQL的查询结果是DataFrame.  
[plain] view plain copy
  1. //字段可以通过下标来获得  
results.map(t => "Name: " + t(0)).collect().foreach(println)
通过StructType直接指定Schema

linux命令详解之df命令

df命令概述df命令作用是列出文件系统的整体磁盘空间使用情况。可以用来查看磁盘已被使用多少空间和还剩余多少空间。 df命令显示系统中包含每个文件名参数的磁盘使用情况,如果没有文件名参数,则显示所有当...
  • gnail_oug
  • gnail_oug
  • 2017-04-18 08:11:41
  • 5979

DF标志和串移动指令(movsb/movsw)

1.标志寄存器的第10位DF,方向标志位。在串处理指令中,控制每次操作后si,di的增减 DF=0,每次操作后,si、di增加 DF=1,每次操作后,si、di减小 我们可以用汇编语法描述movsb的...
  • GetNextWindow
  • GetNextWindow
  • 2014-05-03 08:16:12
  • 1711

df -i 与df -h 的不同

df-h 和df -i的侧重点    这几天巡检数据库,发现脚本里有df -h 和df -i命令开始没在意,后来发现两者是不一样的 [oracle@hvr ~]$ df -h Filesyst...
  • huoshuyinhua
  • huoshuyinhua
  • 2016-03-31 09:59:10
  • 7067

Linux du命令和df命令区别

du,disk usage,是通过搜索文件来计算每个文件的大小然后累加,du能看到的文件只是一些当前存在的,没有被删除的。他计算的大小就是当前他认为存在的所有文件大小的累加和。         df,...
  • wisgood
  • wisgood
  • 2013-12-14 11:20:51
  • 28231

DF计算例子

作为一个例子,让我们考虑仅包含一个传送流的单个会话,其传输比特率为 4.7Mbps:假定每个以太网帧含有 7 个 MPEG 包,那么每个以太网帧的有效荷载中包含的的字节数为 7 × 188 字节 =1...
  • charleslei
  • charleslei
  • 2016-11-12 22:36:06
  • 471

诡异的磁盘空间100%报警分析得出df -h与du -sh的根本性差别

前言:早晨磁盘报警刚清空完tomcat和nginx日志,使用的命令是类似echo "" > show_web-error.log或者> show_web-debug.log清空语句,然后rm -rf ...
  • mchdba
  • mchdba
  • 2014-07-31 09:26:44
  • 5182

Linux中的df命令【简单使用】

linux中的df命令的功能是用来检查Linux服务器的文件系统的磁盘占用情况。可以利用该命令来获取磁盘被占用了多少空间,目前还剩下多少空间等信息。 【命令格式】 df  【选项】 【文件】 【...
  • u010585120
  • u010585120
  • 2015-09-29 16:03:47
  • 2108

参考df代码写的一个简单的df命令的源代码

作者:飞空静渡 df命令可以列出加载的磁盘或各种文件的信息: 下面给出一个简单的df的命令的源码,这个源码根据df的源码进行改写,很简单,就一个主文件 :)#include #include ...
  • fjb2080
  • fjb2080
  • 2010-11-05 17:16:00
  • 4493

[小技巧] 使用df按不同SIZE的单位查看磁盘容量

df 显示磁盘大小的默认值是1024,
  • robertsong2004
  • robertsong2004
  • 2014-08-28 09:29:53
  • 3245

Linux系统指令‘df’详细用法解析

df-查看不同的文件系统有多少空闲的磁盘空间、被挂载文件系统的磁盘利用率(仅以K显示)。 df -h 以可读的方式展示磁盘空间(会根据文件大小以K,M,G直观显示) 展示inode使用情况:i...
  • FENGQIYUNRAN
  • FENGQIYUNRAN
  • 2015-03-28 23:19:32
  • 2760
收藏助手
不良信息举报
您举报文章:RDD->DF
举报原因:
原因补充:

(最多只允许输入30个字)