https://blog.csdn.net/sparkexpert/article/details/51042970

spark dataframe派生于RDD类,但是提供了非常强大的数据操作功能。当然主要对类SQL的支持。

在实际工作中会遇到这样的情况,主要是会进行两个数据集的筛选、合并,重新入库。

首先加载数据集,然后在提取数据集的前几行过程中,才找到limit的函数。

而合并就用到union函数,重新入库,就是registerTemple注册成表,再进行写入到HIVE中。

不得不赞叹dataframe的强大。

具体示例:为了得到样本均衡的训练集,需要对两个数据集中各取相同的训练样本数目来组成,因此用到了这个功能。

scala> val fes = hiveContext.sql(sqlss)
fes: org.apache.spark.sql.DataFrame = [caller_num: string, is_sr: int, call_count: int, avg_talk_time: double, max_talk_time: int, min_talk_time: int, called_num_count: int, called_lsd: double, null_called_count: int]

scala> val fcount = fes.count()
fcount: Long = 4371029

scala> val zcfea = hiveContext.sql(sqls2)
zcfea: org.apache.spark.sql.DataFrame = [caller_num: string, is_sr: int, call_count: int, avg_talk_time: double, max_talk_time: int, min_talk_time: int, called_num_count: int, called_lsd: double, null_called_count: int]

scala> val zcount = zcfea.count()
zcount: Long = 14208117

scala> val f01 = fes.limit(25000)
f01: org.apache.spark.sql.DataFrame = [caller_num: string, is_sr: int, call_count: int, avg_talk_time: double, max_talk_time: int, min_talk_time: int, called_num_count: int, called_lsd: double, null_called_count: int]

scala> val f02 = zcfea.limit(25000)
f02: org.apache.spark.sql.DataFrame = [caller_num: string, is_sr: int, call_count: int, avg_talk_time: double, max_talk_time: int, min_talk_time: int, called_num_count: int, called_lsd: double, null_called_count: int]

scala> val ff=f01.unionAll(f02)
ff: org.apache.spark.sql.DataFrame = [caller_num: string, is_sr: int, call_count: int, avg_talk_time: double, max_talk_time: int, min_talk_time: int, called_num_count: int, called_lsd: double, null_called_count: int]

scala> ff.registerTempTable("ftable01")

scala> hiveContext.sql("create table shtrainfeature as select * from ftable01")
res1: org.apache.spark.sql.DataFrame = []

最后附上dataframe的一些操作及用法:

DataFrame 的函数
Action 操作
1、 collect() ,返回值是一个数组,返回dataframe集合所有的行
2、 collectAsList() 返回值是一个java类型的数组,返回dataframe集合所有的行
3、 count() 返回一个number类型的,返回dataframe集合的行数
4、 describe(cols: String*) 返回一个通过数学计算的类表值(count, mean, stddev, min, and max),这个可以传多个参数,中间用逗号分隔,如果有字段为空,那么不参与运算,只这对数值类型的字段。例如df.describe("age", "height").show()
5、 first() 返回第一行 ,类型是row类型
6、 head() 返回第一行 ,类型是row类型
7、 head(n:Int)返回n行  ,类型是row 类型
8、 show()返回dataframe集合的值 默认是20行,返回类型是unit
9、 show(n:Int)返回n行,,返回值类型是unit
10、 table(n:Int) 返回n行  ,类型是row 类型

dataframe的基本操作
1、 cache()同步数据的内存
2、 columns 返回一个string类型的数组,返回值是所有列的名字
3、 dtypes返回一个string类型的二维数组,返回值是所有列的名字以及类型
4、 explan()打印执行计划  物理的
5、 explain(n:Boolean) 输入值为 false 或者true ,返回值是unit  默认是false ,如果输入true 将会打印 逻辑的和物理的
6、 isLocal 返回值是Boolean类型,如果允许模式是local返回true 否则返回false
7、 persist(newlevel:StorageLevel) 返回一个dataframe.this.type 输入存储模型类型
8、 printSchema() 打印出字段名称和类型 按照树状结构来打印
9、 registerTempTable(tablename:String) 返回Unit ,将df的对象只放在一张表里面,这个表随着对象的删除而删除了
10、 schema 返回structType 类型,将字段名称和类型按照结构体类型返回
11、 toDF()返回一个新的dataframe类型的
12、 toDF(colnames:String*)将参数中的几个字段返回一个新的dataframe类型的,
13、 unpersist() 返回dataframe.this.type 类型,去除模式中的数据
14、 unpersist(blocking:Boolean)返回dataframe.this.type类型 true 和unpersist是一样的作用false 是去除RDD

集成查询:
1、 agg(expers:column*) 返回dataframe类型 ,同数学计算求值
df.agg(max("age"), avg("salary"))
df.groupBy().agg(max("age"), avg("salary"))
2、 agg(exprs: Map[String, String])  返回dataframe类型 ,同数学计算求值 map类型的
df.agg(Map("age" -> "max", "salary" -> "avg"))
df.groupBy().agg(Map("age" -> "max", "salary" -> "avg"))
3、 agg(aggExpr: (String, String), aggExprs: (String, String)*)  返回dataframe类型 ,同数学计算求值
df.agg(Map("age" -> "max", "salary" -> "avg"))
df.groupBy().agg(Map("age" -> "max", "salary" -> "avg"))
4、 apply(colName: String) 返回column类型,捕获输入进去列的对象
5、 as(alias: String) 返回一个新的dataframe类型,就是原来的一个别名
6、 col(colName: String)  返回column类型,捕获输入进去列的对象
7、 cube(col1: String, cols: String*) 返回一个GroupedData类型,根据某些字段来汇总
8、 distinct 去重 返回一个dataframe类型
9、 drop(col: Column) 删除某列 返回dataframe类型
10、 dropDuplicates(colNames: Array[String]) 删除相同的列 返回一个dataframe
11、 except(other: DataFrame) 返回一个dataframe,返回在当前集合存在的在其他集合不存在的
12、 explode[A, B](inputColumn: String, outputColumn: String)(f: (A) ⇒ TraversableOnce[B])(implicit arg0: scala.reflect.api.JavaUniverse.TypeTag[B]) 返回值是dataframe类型,这个 将一个字段进行更多行的拆分
df.explode("name","names") {name :String=> name.split(" ")}.show();
将name字段根据空格来拆分,拆分的字段放在names里面
13、 filter(conditionExpr: String): 刷选部分数据,返回dataframe类型 df.filter("age>10").show();  df.filter(df("age")>10).show();   df.where(df("age")>10).show(); 都可以
14、 groupBy(col1: String, cols: String*) 根据某写字段来汇总返回groupedate类型   df.groupBy("age").agg(Map("age" ->"count")).show();df.groupBy("age").avg().show();都可以
15、 intersect(other: DataFrame) 返回一个dataframe,在2个dataframe都存在的元素
16、 join(right: DataFrame, joinExprs: Column, joinType: String)
一个是关联的dataframe,第二个关联的条件,第三个关联的类型:inner, outer, left_outer, right_outer, leftsemi
df.join(ds,df("name")===ds("name") and  df("age")===ds("age"),"outer").show();
17、 limit(n: Int) 返回dataframe类型  去n 条数据出来
18、 na: DataFrameNaFunctions ,可以调用dataframenafunctions的功能区做过滤 df.na.drop().show(); 删除为空的行
19、 orderBy(sortExprs: Column*) 做alise排序
20、 select(cols:string*) dataframe 做字段的刷选 df.select($"colA", $"colB" + 1)
21、 selectExpr(exprs: String*) 做字段的刷选 df.selectExpr("name","name as names","upper(name)","age+1").show();
22、 sort(sortExprs: Column*) 排序 df.sort(df("age").desc).show(); 默认是asc
23、 unionAll(other:Dataframe) 合并 df.unionAll(ds).show();
24、 withColumnRenamed(existingName: String, newName: String) 修改列表 df.withColumnRenamed("name","names").show();
25、 withColumn(colName: String, col: Column) 增加一列 df.withColumn("aa",df("name")).show();

最新文章

  1. 玩转spring boot——AOP与表单验证
  2. 关于jquery简单操作简单表格
  3. 简易c语言文法
  4. cowboy-高性能简洁的erlang版web框架
  5. 归纳整理 PHP大神的十大优良习惯
  6. POJ 3685
  7. Android_SystemService
  8. JDK自带方法实现RSA数字签名
  9. 正则表达式替换img标签src值!!!
  10. 14.5.2.2 autocommit, Commit, and Rollback
  11. 网络编程TCP总结及实践-C语言
  12. 虚拟机克隆linux系统后需要做的网络设置
  13. CentOS 7.2 部署Saltstack
  14. day02编程语言介绍及python介绍
  15. linux代码笔记
  16. bootstrap增删改查
  17. 公网用户接入NAT后面的freeswitch配置
  18. DAC--使用DAC来导出数据库脚本
  19. Scrum Meeting 11.09
  20. 性能测试工具 nGrinder 项目剖析及二次开发

热门文章

  1. 《Linux 性能及调优指南》1.6 了解Linux性能指标
  2. angularjs路由相关知识
  3. Python的字典类型
  4. 非阻塞套接字编程, IO多路复用(epoll)
  5. HANA Database SR Basis Setting
  6. 《汇编语言 基于x86处理器》第十三章高级语言接口部分的代码 part 2
  7. spark 常用技巧总结
  8. PHP企业微信配置点击事件。
  9. python的字符串分片
  10. ActiveMQ 学习