dataset的去重计数 g2_Spark Dataset DataFrame 操作

本文详细介绍了Spark SQL中DataFrame和Dataset的使用,包括数据加载、转换、去重、计数、统计分析等操作,如distinct、dropDuplicates、count、groupBy、agg等函数的用法,并展示了如何处理空值null和NaN。
摘要由CSDN通过智能技术生成

相关博文参考

sparksql中dataframe的用法

import groovy.sql.DataSet

import org.apache.log4j.{Level, Logger}

import org.apache.spark.sql.{DataFrame, Row, SparkSession}

object sparkSession {

case class Person(name:String,age:BigInt)

Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)

def main(args: Array[String]): Unit = {

val spark = SparkSession

.builder()

.master("local[4]")

.appName("Spark SQL Example")

.getOrCreate()

//读取json文件,返回一个dataframe;

val df = spark.read.json("D:\\people.json")

import spark.implicits._

//查看DataFrame中的内容,默认显示20行;

df.show()

//----------------------dataframe和dataSet相互转换-----------------------------------

// val df:DataFrame = DataSet[Row] //dataframe和dataSet的关系;

val ds = df.as[Person]

val ds_1 = df.toJSON

val df_new = ds.toDF()

//----------------------------------------------------------------------------------

//打印DataFrame的Schema信息;可以理解为模型;

df.printSchema()

//查看DataFrame部分列中的内容,age

df.select("age").show()

//查看DataFrame部分列中的内容,age+1

df.select($"name",$"age"+1).show

//另外一种写法;查看age和name;

df.select(df("age"),df("name")).show()

//过滤age大于20的,显示10行;

df.filter($"age" > 20).show(10)

//统计年龄大于20的人数;

df.filter(df("age") > 20).count()

//按年龄进行分组,统计人数;

df.groupBy("name").count().show()

//collect方法会将df中的所有数据都获取到,并返回一个Row类型的Array对象

df.collect().foreach(println)

//和上面的类似,返回一个Row类型的List集合;

val list = df.collectAsList()

//获取指定字段的统计信息;

df.describe("name","age").show()

//跟sql语句的where条件一样;

df.where("age = 18 and name = 'jason'").show()

//根据某个字段筛选;

df.filter("name = 'jason'").show()

//获取指定的字段可以对字段做一些特殊的操作,可以写别名;

df.selectExpr("age","name as n").show()

//获取指定的字段,注意这个一次只能获取一个字段;

val age = df.col("age")

println(age)

//和上面的一样,也是获取某个字段;

val name = df.apply("name")

println(name)

//删除指定的字段;

df.drop("age").show()

//跟sql的limit一样,显示前几行;

df.limit(5).show()

//根据某个字段排序;

df.orderBy(df("age").desc).show()

//按照partition进行排序;

df.sortWithinPartitions("age").show()

//跟sql里面的一样,根据某个字段分组;

val groupby_name = df.groupBy("name").count().show()

//结合groupby做一些聚合操作;

df.groupBy("age").max().show()

//去重;

df.distinct().show()

//指定字段去重;

df.dropDuplicates("name").show()

//聚合操作;

df.agg("age"-> "max","age"-> "min").show()

//对结果叠加;

df.union(df).show()

//跟sql里面的join一样支持,left join,right join,inner join,这个操作非常的丰富,这里就不在一一列举了;

df.join(df,Seq("age"),"left").show()

//获取两个df中相同的数据,相当于inner join;

df.intersect(df).show()

//对指定字段重命名;

df.withColumnRenamed("name","name1").show()

//增加新的字段,默认显示为null

df.withColumn("name1",df("age")).show()

//前几天有人问我增加新的字段显示为0,怎么写?选择一列数值类型的乘以0就可以了;

df.withColumn("name2",df("age")*0).show()

}

}

一、Spark2 Dataset DataFrame空值null,NaN判断和处理

1.1 显示前10条数据

val data1 = data.toDF("affairs", "gender", "age", "yearsmarried", "children", "religiousness", "education", "occupation", "rating")

data1.limit(10).show

+-------+------+---+------------+--------+-------------+---------+----------+------+

|affairs|gender|age|yearsmarried|children|religiousness|education|occupation|rating|

+-------+------+---+------------+--------+-------------+---------+----------+------+

| 0| male| 37| 10| no| 3| 18| 7| 4|

| 0| null| 27| null| no| 4| 14| 6| null|

| 0| null| 32| null| yes| 1| 12| 1| null|

| 0| null| 57| null| yes| 5| 18| 6| null|

| 0| null| 22| null| no| 2| 17| 6| null|

| 0| null| 32| null| no| 2| 17| 5| null|

| 0|female| 22| null| no| 2| 12| 1| null|

| 0| male| 57| 15| yes| 2| 14| 4| 4|

| 0|female| 32| 15| yes| 4| 16| 1| 2|

| 0| male| 22| 1.5| no| 4| 14| 4| 5|

+-------+------+---+------------+--------+-------------+---------+----------+------+

1.2 删除所有列的空值和NaN

val resNull=data1.na.drop()

resNull.limit(10).show()

+-------+------+---+------------+--------+-------------+---------+----------+------+

|affairs|gender|age|yearsmarried|children|religiousness|education|occupation|rating|

+-------+------+---+------------+--------+-------------+---------+----------+------+

| 0| male| 37| 10| no| 3| 18| 7| 4|

| 0| male| 57| 15| yes| 2| 14| 4| 4|

| 0|female| 32| 15| yes| 4| 16| 1| 2|

| 0| male| 22| 1.5| no| 4| 14| 4| 5|

| 0| male| 37| 15| yes| 2| 20| 7| 2|

| 0| male| 27| 4| yes| 4| 18| 6| 4|

| 0| male| 47| 15| yes| 5| 17| 6| 4|

| 0|female| 22| 1.5| no| 2| 17| 5| 4|

| 0|female| 27| 4| no| 4| 14| 5| 4|

| 0|female| 37| 15| yes| 1| 17| 5| 5|

+-------+------+---+------------+--------+-------------+---------+----------+------+

1.3 删除某列的空值和NaN

//删除某列的空值和NaN

val res=data1.na.drop(Array("gender","yearsmarried"))

1.4 删除某列的非空且非NaN的低于10的

// 删除某列的非空且非NaN的低于10的

data1.na.drop(10,Array("gender","yearsmarried"))

1.5 填充所有空值的列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值