spark sql——3. Dataframe及常用操作

在《实例:spark sql操作hive表》中可以看到,都是对dataframe进行操作

spark sql以DataFrame作为基础数据类型

 

 

在spark-shell中操作:

 

DataFrame:

DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库中的二维表。

DataFrame相当于对RDD进行了封装,schema RDD,带有schema(表头、列名等)元信息。

 

 

与《实例:spark sql操作hive表》结合着看

可参考博客:https://www.cnblogs.com/swordfall/p/9006088.html

可去spark sql官网查看:http://spark.apache.org/docs/latest/sql-programming-guide.html

 

 

DataFrame常用操作

DataFrame常用操作有两种风格:

1. dsl风格

2. sql风格

 

dsl风格:

查看dataframe表内容:

personDF.show

查看表结构:

personDF.printSchema() 如: // |-- age: long (nullable = true) // |-- name: string (nullable = true)

查看name列:

scala> personDF.select("name").show

还有其它复杂的写法:

personDF.select(personDF.col("name")).show

personDF.select(col("name")).show

+--------+

| name|

+--------+

|tingting|

|ningning|

| ruhua|

| mimi|

+--------+

查看多个列:

scala> personDF.select("name","age").show

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

| name|age|

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

|tingting| 23|

|ningning| 25|

| ruhua| 27|

| mimi| 33|

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

 

age列加1:

scala> personDF.select(col("name"),col("age")+1).show

或者:personDF.select($"name",$"age"+1).show

注意:personDF.select("name","age"+1)不能运行

执行运算等操作时需要加col或$,不然报错

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

| name|(age + 1)|

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

|tingting| 24|

|ningning| 26|

| ruhua| 28|

| mimi| 34|

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

 

过滤:

执行运算等操作时需要加col或$,不然报错

scala> personDF.filter($"age">=25).show

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

| id| name|age|faceValue|

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

| 2|ningning| 25| 90|

| 3| ruhua| 27| 60|

| 4| mimi| 33| 85|

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

 

分组:

按年龄分组,并统计相同年龄的人数

scala> personDF.groupBy("age").count().show

+---+-----+

|age|count|

+---+-----+

| 27| 1|

| 23| 1|

| 25| 1|

| 33| 1|

+---+-----+

 

sql风格:

想要使用sql语句来查询,必须将DataFrame注册成一张表

注册:

将DataFrame(personDF)注册成表(t_person)

personDF.registerTempTable("t_person")

注意:

spark2.0起,registerTempTable被弃用,使用createOrReplaceTempView

 

查询,执行sql语句:

(读取person表,按年龄降序排列,输出两个)

scala> import spark.sql

scala> sql("select * from t_person order by age desc limit 2").show

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

| id| name|age|faceValue|

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

| 4| mimi| 33| 85|

| 3|ruhua| 27| 60|

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

 

 

 

 

 

 

其它多种类型文件的读取、保存dataframe方法:

包括本地文件、json文件、hive表、jdbc到其它数据库等

http://spark.apache.org/docs/latest/sql-data-sources-load-save-functions.html

 

 

表的保存与读取:(《2. 实例:spark sql操作hive表》)

resultDF.write.saveAsTable("people_result")

spark.table("people_result")

 

读取通用本地文件:

spark.sql("create table if not exists people_age(name string,age int) row format delimited fields terminated by ','")

spark.sql("load data local inpath '/test/age.txt' into table people_age")

 

读取csv文件:

val peopleDFCsv = spark.read.format("csv") .option("sep", ";") .option("inferSchema", "true") .option("header", "true") .load("examples/src/main/resources/people.csv")

 

读取json文件:

val peopleDF = spark.read.json("examples/src/main/resources/people.json")

 

可以直接使用SQL查询文件,而不是使用取API将文件加载到DataFrame在查询:

val sqlDF = spark.sql("SELECT * FROM parquet.`examples/src/main/resources/users.parquet`")

 

保存到持久表:

resultDF.write.saveAsTable("people_result")

df.write.option("path", "/some/path").saveAsTable("t")

df.write.mode(SaveMode.Overwrite).saveAsTable("hive_records") 写的时候覆盖

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值