Spark DataFrame 操作命令

来源:互联网 发布:ajax实例java类代码 编辑:程序博客网 时间:2024/05/16 14:12

一、Hive下生成DataFrame对象

SparkConf sparkConf = new SparkConf().setAppName("名称").setMaster("执行方式");JavaSparkContext jsc = new JavaSparkContext(sparkConf);HiveContext hc = new HiveContext(jsc);#通过执行SQL生成DataFrameDataFrame dataFrame= hc.sql("执行SQL")#通过HiveContext创建DataFrameDataFrame dataFrame2 = hc.createDataFrame(JavaRDD, schema)

二、DataFrame对象上Action操作

1、show:展示数据

以表格的形式在输出中展示jdbcDF中的数据,类似于select * from spark_sql_test的功能。

show方法有四种调用方式,分别为:

jdbcDF.show  //只显示前20条记录
show(numRows)     //显示numRows条记录
show(truncate: Boolean)     //是否最多只显示20个字符,默认为true
show(numRows: Int, truncate: Boolean)         //综合前面的显示条数以及对过长字符串的显示格式

2、collect:获取所有数据到数组

不同于前面的show方法,这里的collect方法会将jdbcDF中的所有数据都获取到,并返回一个Array对象。

jdbcDF.collect()

3、collectAsList:获取所有数据到List

功能和collect类似,只不过返回结构变为了List

jdbcDF.collectAsList()

4、describe(cols: String*):获取指定字段的统计信息

这个方法可以动态的传入一个或多个String类型的字段名,结果仍然为DataFrame对象,用于统计数值类型字段的统计值,比如count, mean, stddev, min, max等。

jdbcDF .describe("c1" , "c2", "c4" ).show()

5、first, head, take, takeAsList:获取若干行记录

这里列出的四个方法比较类似,其中 :
1. first获取第一行记录
2. head获取第一行记录,head(n: Int)获取前n行记录
3. take(n: Int)获取前n行数据
4. takeAsList(n: Int)获取前n行数据,并以List的形式展现

Row或者Array[Row]的形式返回一行或多行数据。firsthead功能相同。 taketakeAsList方法会将获得到的数据返回到Driver端,所以,使用这两个方法时需要注意数据量,以免Driver发生OutOfMemoryError

二、DataFrame对象上的条件查询和join等操作

以下返回为DataFrame类型的方法,可以连续调用。

1、where条件相关

(1)where(conditionExpr: String)

SQL语言中where关键字后的条件 ,传入筛选条件表达式,可以用and和or。得到DataFrame类型的返回结果

jdbcDF.where("id = 1 or c1 = 'b'" ).show()

(2)filter

根据字段进行筛选 ,传入筛选条件表达式,得到DataFrame类型的返回结果。和where使用条件相同

jdbcDF.filter("id = 1 or c1 = 'b'" ).show()

2、查询指定字段

(1)select:获取指定字段值

根据传入的String类型字段名,获取指定字段的值,以DataFrame类型返回

jdbcDF.select( "id" , "c3" ).show( false)

还有一个重载的select方法,不是传入String类型参数,而是传入Column类型参数。可以实现select id, id+1 from test这种逻辑。

jdbcDF.select(jdbcDF( "id" ), jdbcDF( "id") + 1 ).show( false)

这里写图片描述

(2)selectExpr:可以对指定字段进行特殊处理

可以直接对指定字段调用UDF函数,或者指定别名等。传入String类型参数,得到DataFrame对象。

# 示例,查询id字段,c3字段取别名time,c4字段四舍五入jdbcDF .selectExpr("id" , "c3 as time" , "round(c4)" ).show(false)

这里写图片描述

(3)col:获取指定字段

只能获取一个字段,返回对象为Column类型。

val idCol = jdbcDF.col(“id”)

(4)apply:获取指定字段

只能获取一个字段,返回对象为Column类型

val idCol1 = jdbcDF.apply("id")val idCol2 = jdbcDF("id")

(5)drop:去除指定字段,保留其他字段

返回一个新的DataFrame对象,其中不包含去除的字段,一次只能去除一个字段。

jdbcDF.drop("id")jdbcDF.drop(jdbcDF("id"))

3、limit

limit方法获取指定DataFrame的前n行记录,得到一个新的DataFrame对象。和take与head不同的是,limit方法不是Action操作。

jdbcDF.limit(3).show( false)

4、order by

(1)orderBy和sort:按指定字段排序,默认为升序

示例1,按指定字段排序。加个-表示降序排序。sort和orderBy使用方法相同

jdbcDF.orderBy(- jdbcDF("c4")).show(false)// 或者jdbcDF.orderBy(jdbcDF("c4").desc).show(false)

示例2,按字段字符串升序排序

jdbcDF.orderBy("c4").show(false)

(2)sortWithinPartitions

和上面的sort方法功能类似,区别在于sortWithinPartitions方法返回的是按Partition排好序的DataFrame对象。

5、group by

groupBy:根据字段进行group by操作

groupBy方法有两种调用方式,可以传入String类型的字段名,也可传入Column类型的对象。

jdbcDF .groupBy("c1" )jdbcDF.groupBy( jdbcDF( "c1"))

6、distinct

distinct:返回一个不包含重复记录的DataFrame

返回当前DataFrame中不重复的Row记录。该方法和接下来的dropDuplicates()方法不传入指定字段时的结果相同。

jdbcDF.distinct()

7、聚合

聚合操作调用的是agg方法,该方法有多种调用方式。一般与groupBy方法配合使用。 以下示例其中最简单直观的一种用法,对id字段求最大值,对c4字段求和。

jdbcDF.agg("id" -> "max", "c4" -> "sum")

8、union

unionAll方法:对两个DataFrame进行组合 ,类似于SQL中的UNION ALL操作。

jdbcDF.unionALL(jdbcDF.limit(1))

9、join

在SQL语言中用得很多的就是join操作,DataFrame中同样也提供了join的功能。 接下来隆重介绍join方法。在DataFrame中提供了六个重载的join方法。

(1)、笛卡尔积

joinDF1.join(joinDF2)

(2)、using一个字段形式

下面这种join类似于a join b using column1的形式,需要两个DataFrame中有相同的一个列名

joinDF1.join(joinDF2, "id")

(3)、using多个字段形式

除了上面这种using一个字段的情况外,还可以using多个字段,如下

joinDF1.join(joinDF2, Seq("id", "name")

(4)、指定join类型

两个DataFrame的join操作有inner, outer, left_outer, right_outer, leftsemi类型。在上面的using多个字段的join情况下,可以写第三个String类型参数,指定join的类型,如下所示

joinDF1.join(joinDF2, Seq("id", "name"), "inner"

(5)、使用Column类型来join

如果不用using模式,灵活指定join字段的话,可以使用如下形式

joinDF1.join(joinDF2 , joinDF1("id" ) === joinDF2( "t1_id"))

(6)、在指定join字段同时指定join类型

joinDF1.join(joinDF2 , joinDF1("id" ) === joinDF2( "t1_id"), "inner")
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 写作文没思路怎么办 孩子不爱写作文怎么办 写作文没有素材怎么办 写作文没有灵感怎么办 做事工作马虎粗心大意怎么办 小孩作业马虎粗心大意怎么办 孩子写字一直错怎么办 孩子写字老错怎么办 写错字涂黑了怎么办 写错字不能涂改怎么办 孩子爱写错别字怎么办 孩子读题马虎怎么办 孩子知错不该怎么办 小孩胆小反应慢怎么办 孩孑经常流鼻血怎么办 中考考号写错了怎么办 头后仰就头晕怎么办 感觉自己要晕倒怎么办 孩子不愿动手写字怎么办 老年人恶心想吐怎么办 小学生老写错别字怎么办 突然头晕站不稳 怎么办 早上起床突然天旋地转怎么办 躺着突然感觉天旋地转怎么办 眩晕症发作时怎么办 低血糖恶心想吐怎么办 更年期头晕头胀怎么办 年轻人头晕头胀怎么办 教案:《眯眼了怎么办》 迷路了怎么办活动意图 幼儿迷路了怎么办图片 中班迷路了怎么办教案 大门与大门相对怎么办 孩子长倒睫毛怎么办 孩子考倒数第一怎么办 孩子在班里倒数怎么办 宝宝不用吸管杯怎么办 婴儿发烧37.6度怎么办 宝宝体温37.2度怎么办 宝宝发烧37.2度怎么办 宝宝半夜37.2度怎么办