这个类似于hive为mapreduce提供上层接口,使数据分析师可以不必为写mapreduce的Java代码而烦恼,同样并不是所有工程师都会Scala语言,所以spark sql就是做这个事情的。
spark sql是spark用来处理结构化数据的模块,它提供一个叫dataframe的编程抽象结构数据模型(带有schema信息的RDD),用户可以通过sql,dataframe API,dataset api三种方式
现在讲dataframe
spark.read.text("people.txt")
spark.read.csv("people.csv")
spark.read.json("people.json")
spark.read.parquet("people.parquet")
如果hdfs文件系统的/spark目录下有一个word.txt文件,那么就可以创建dataframe
val personDF=spark.read.text("/spark/word.txt")
查看personDF属性
personDF.printSchema()
打印personDF
personDF.show()
RDD转换dataframe
调用RDD的toDF()方法
val lines=sc.textFile("/spark/student.txt").map(_.split(" "))
case class Person(id:Int,name: String, age:Int)
val personRDD=lines.map(x=>Person(x(0).toInt,x(1),x(2).toInt))
val personDF=personRDD.toDF()
scala> personDF.show
+---+-----+---+
| id| name|age|
+---+-----+---+
| 1|zhang| 20|
| 2| li| 10|
| 3| xiao| 21|
| 4| wang| 90|
| 5|jiang| 80|
查看数据属性
personDF.printSchema
对dataframe的操作和Python极其相似
show()
printSchema()
select(), select的语法和sql相似
personDF.select(personDF.col("name")).show()
personDF.select(personDF("name").as("username"),personDF("age").show())
filter(),过滤,其实就是条件查询
personDF.filter(personDF("age")>=25).show()
groupBy() 对记录进行分组
personDF.groupBy("age").count().show()
sort(), 对特定字段进行排序操作
对年龄排序
personDF.sort(personDF("age").desc).show()
dataframe的强大之处就是可以将它看做一个关系型数据表,然后可以在程序中直接使用spark.sql()的方式执行sql 查询
而使用sql表操作的前提是需要将dataframe注册成为一个临时表
personDF.registerTempTable("t_person")
这样的好处,就是可以直接使用sql语句
spark.sql("select * from t_person order by age desc limit 2").show()
不过注意,这个操作,就是sql的操作貌似是要依赖 hive的
提供了一种特定域对象中的强类型集合,也就是在RDD的每行数据中添加了类型的约束条件,只有满足约束条件的数据类型才能正常运行。
这就是相当于Java中的泛型
dataset的创建
val personDS=spark.createDataset(sc.textFile("/spark/person.txt"))
personDS.show()