目录
describe(cols: String*): DataFrame
head(n: Int): Array[T]&head()&first()&take()&takeAsList
collect()&collectAsList()&toLocalIterator()
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