在《实例: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") 写的时候覆盖