SparkSql-DataFrame

一、DataFrame的相关方法

1、show
作用:展示数据

show(numRows:Int,truncate:Boolean)

show(numRows:Int)

numRows:表示展示的行数(默认展示20行)
Truncate:只有两个取值true,false,表示一个字段是否最多显示20个字符,默认为true
2、collect
作用:获取一个dataframe的里面的数据 形成的是一个数组

注意:返回的是一个array 适用于数据量比较小的场景
3、collectAsList
作用:获取一个dataframe里面的数据,形成的是一个list集合

注意:返回的是一个list 适用于数据量小的场景
4、describe
作用:获取指定字段的统计信息

personDF.describe("age").show()

+-------+------------------+
|summary           |               age|
+-------+------------------+
|  count(记录条数) |                 3|
|   mean(平均值)   |16.333333333333332|
| stddev(样本标准差)|2.3094010767585034|
|    min(最小值)   |                15|
|    max(最大值)  |                19|
+-------+------------------+
5、first、head、take、takeAsList
作用:获取若干行记录
用法:
frist():获取第一行记录 ,返回一个row对象

head(n:Int):获取前n行记录 ,返回一个Array对象

take(n:Int):获取前n行记录,返回一个Array对象

takeAsList(n:Int):获取前n行记录,返回一个List对象

注意点:take和takeAsList方法会将获取的数据返回到Driver中,所以要注意数据量,避免Driver发生OutOfMemoryError
6、where
用法:
where(conditionExpr:String)

例如:df.where("name='jack' or age=10")
作用:条件相关

where(condition:Column)
例如:df.where($"age">20)

注意点:在例子中出现的$"age"提取age列数据作比较时,要用到隐式转换
7、filter
作用:根据字段进行筛选
用法:
filter(conditionExpr:String)
filter(condition:Column)
注意点:
filter跟where用法基本一致
8、查询指定列
select
作用:获取指定字段值
用法:
select(col:String)
select(col:Column)

注意点:
select(col:Column)这种方式可以实现df.select($"colA",$"colB"+1)

selectExpr()
作用:可以对指定字段进行特殊处理
用法:
df.selectExpr(exprs:String*)
例如:df.selectExpr("colA","colB as newName","abs(colC)")

注意点:
返回DataFrame对象

col()
作用:获取指定字段
用法:
col(colName:String)

注意点:
只能获取一个字段,返回对象为Column
apply()
作用:获取指定列
用法:
apply(colName:Stirng)
注意点:
只能获取一个字段,返回对象为Column
drop()
作用:去除指定字段,保留其他字段
用法:
drop(colName:String)
drop(colName:Column)
注意点:
返回一个新的DataFrame对象,其中不包含去除的字段,一次只能去除一个字段
9、order by
作用:排序操作

用法:
	orderBy(sortExprs:Column*)
	orderBy(sortCol : String , sortCols : String*)

注意点:
按指定字段排序,默认是升序。也支持多个字段的排序,返回的是DataFrame
10、sort
注意点:
	按指定字段排序,默认是升序。也支持多个字段的排序,返回的是DataFrame
作用:排序操作
用法:
	sort(sortExprs:Column*)
	sort(sortCol : String , sortCols : String*)
注意点:
	按指定字段排序,默认是升序。也支持多个字段的排序,返回的是DataFrame
11、sortWithinPartitions
作用:分区内排序
	用法:
		sortWithinPartitions(sortExprs:Column*)
		sortWithinPartitions(sortCol : String , sortCols : String*)
	注意点:
		和sort方法功能类似,区别在于sortWithinPartitions方法返回的是排好序的每一个partition的DataFrame
12、groupby
作用:进行分组
groupby(col1:String,cols:String*)
groupby(cols:Column*)
注意点:
groupby之后得到的是RelationalGroupedDataset类型对象,API提供了group by之后的操作,max( ),min( ), mean( ) ,sum( ) ,Count( )
13、distinct
作用:去重操作(去除重复行)
用法:
distinct()
注意点:
返回一个不包含重复ROW记录的DataFrame
14、agg
agg
作用:聚合操作
用法:
agg(aggExpr:(String,String),aggExprs:(String:String)*)
例如:df.agg("age"->"mean","phone"->"max").show()
注意点:
一般与groupby方法配合使用,也可以单独使用

agg(
      max($"ORG_NO") as "ORG_NO", //供电单位编号
      max($"ORG_TYPE") as "ORG_TYPE", //供电单位类型
      max($"GRID_NO") as "GRID_NO", // 网格编号
      max($"GRID_NAME") as "GRID_NAME", //网格名称
      max($"STAT_DATE") as "STAT_DATE" //统计日期
)
15、union
union
作用:合并操作
用法:
union(other:Dataset)
注意点:
union方法对两个字段一致的DataFrame进行组合,返回一个新的DataFrame
16、join
join
	作用:连接操作
	用法:
		①join(right:Dataset,usingColumn:String)
		②join(right:Dataset,usingColumn:Seq[String])
		③join(right:Dataset,usingColumn:Seq[String],joinType:String)
		④join(right:Dataset,joinExprs:Column)
		⑤join(right:Dataset,joinExprs:Column,joinType:String)
	注意点:
		第①②的区别在于①表示一个字段的String,后者表示多个字段Seq(序列)

dataframe save spark sql 带分隔符 spark dataframe show_升序

17、intersect
intersect
作用:获取两个DataFrame中共有的记录
用法:
例如:df.intersect(df.limit(1))
注意点:
18、except
except
作用:获取一个DataFrame中有另一个DataFrame中没有的记录
用法:
例如:df.except(df.limit(1))
19、withColumn
withColumn
作用:往当前DataFrame中新增一列
用法:
例如:df.withColumn(“age*2”,df("age")*2)
	withColumn(colName:String,col:Column)
注意点:
col该列可来源于本身DataFrame对象,不可以来自其他的DataFrame

withcloumn里面也可以写对这个所加字段的判断等操作
20、na
na 作用:对具有空值列的行数据进行处理
用法:drop()
例如:df.na.drop()
删除所有具有空值列的行
例如:df.na.drop(Array("sex"))
删除sex列具有空值的行
fill()
例如:df.na.fill(Map("age",2))
将age列的空值替换成2
将age列的空值替换成2

![在这里插入图片描述](https://img-blog.csdnimg.cn/2020101123421627.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0Nhcm5hdGlvbl9z,size_16,color_FFFFFF,t_70#pic_center)



##### 21 lit 和 exper

```scala
作用:对于特定的列进行处理 
lit 一般给个特定的的值给所需要的字段
exper 表示可以对字段 进行特殊的处理
可以写case ....when

dataframe save spark sql 带分隔符 spark dataframe show_spark_02

22、when
作用:对于一个特定的列进行处理

dataframe save spark sql 带分隔符 spark dataframe show_spark_03

二、UDF

dataframe save spark sql 带分隔符 spark dataframe show_升序_04

三、列转行

pivot函数(透视函数)

四、常用的日期函数
  • 实际日期:2020-10-08
1、date_add 指定日期n天之后
dataDF.select(date_add($"date",2) as "add_date").show()
2、add_months 指定日期n月之后
dataDF.select(add_months($"date",2) as "add_month").show()
3、datediff 计算两个日期相差天数
dataDF.select($"date",date_add($"date",2) as "add_date").select(datediff($"add_date",$"date") as "diff_number").show()
4、dayofmonth 返回日期中的日
dataDF.select(dayofmonth($"date") as "day_date").show()
5、weekofyear 返回日期在一年中的周数
dataDF.select(weekofyear($"date") as "weekofyear").show()
6、to_date 返回时间戳中的日期部分
dataDF.select(to_date($"date")).show()
7、year、quarter(季度)、month、day、hour、minute、second、date_sub、to_timestamp(将时间转化为正常日期格式)