spark sql Dataset&Dataframe算子大全

本文围绕Spark SQL展开,介绍了Dataset和Dataframe的特点,如DataFrame行类型为Row,Dataset行类型更灵活。还阐述了RDD、Dataset、Dataframe之间的互相转换,以及多种Dataset和Dataframe算子,包括show()、na()、sort()等的功能和使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

Dataset&Dataframe

RDD,Dataset,Dataframe互相转换

Dataset&Dataframe算子

show()

na()    返回包含null值的行

stat()

sortWithinPartitions()

sort()&order by()

hint()

selectExpr()

filter&where

groupBy&rollup&cube

reduce

groupByKey()

agg()

limit(n:Int)

union

intersect()

except()

sample()

randomSplit()

flatMap&explode

withColumn

 withColumnRenamed

drop

dropDuplicates()

describe(cols: String*): DataFrame

head(n: Int): Array[T]&head()&first()&take()&takeAsList

map&mapPartitions

collect()&collectAsList()&toLocalIterator()

count()


Dataset&Dataframe

type DataFrame = Dataset[Row]

DataFrame每一行类型为Row,DataSet就没这限制了。

//查hive表
val df=spark.sql("select date,status,api from data.api")//df的类型为sql.Dataframe

val ds1=df.map(ele=>(ele.getString(0)))
val ds2=df.map(ele=>(ele.getString(0),ele.getLong(1),ele.getString(2)))
//元素ele的类型为Row,获取值必须调用get()或者get类型()方法,df.map将隐式转换为Dataset

ds1.map(ele=>(ele))//ele类型为String
ds2.map(ele=>(ele._1,ele._2,ele._3))//ele类型为tuple

Dataframe行类型为Row,如果想获取具体字段值,必须调用Row的get()或get类型()方法

Datset行类型可以为String,可以为tuple等等,获取值像RDD那样

RDD,Dataset,Dataframe互相转换

RDD转别的

val rdd=spark.sparkContext.textFile("C:\\zlq\\data\\people.txt")

val rdd1=rdd.map(ele=>(ele.split(",")(0),ele.split(",")(1).trim.toInt))
rdd1.toDF("name","age")//转df,指定字段名
rdd1.toDS()//转ds

case class Person(name:String,age:Int)
val rdd2=rdd.map(_.split(","))
.map(ele=>(Person(ele(0),ele(1).trim.toInt))).toDF()//将自定义类转df

val schemaString="name age"
val fields=schemaString.split(" ")
    .map(ele=>StructField(ele,StringType,nullable = true))
val schema=StructType(fields)
val rdd3=rdd.map(_.split(",")).map(ele=>Row(ele(0),ele(1).trim))
val df=spark.createDataFrame(rdd3,schema)//将StructType作用到rdd上,转df

Dataframe转别的

val df=spark.sql("select date,status,api from data.api")

df.rdd
//df转ds就太多了,先列举几个
df.as() map filter flatMap等等吧

Dataset转别的

ds.rdd
//ds转df也不少,先列举
select join agg toDF()

Dataset&Dataframe算子

show()

show()//默认显示20行,字段值超过20,默认截断
show(numRows: Int)//指定显示行数
show(truncate: Boolean)//指定是否截断超过20的字符
show(numRows: Int, truncate: Boolean)//指定行数,和是否截断
show(numRows: Int, truncate: Int)//指定行数,和截断的字符长度

na()    返回包含null值的行

val df=spark.read.json("C:\\zlq\\data\\people.json")
df.show()
df.na.drop().show()

 

stat()

//{"name":"Michael"}
//{"name":"Andy", "age":30}
//{"name":"Justin", "age":19}
//{"name":"Tom", "age":19}
//{"name":"je
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值