第三章:《Spark之----Spark SQL》摘要

一、从文件中生成DataFrame

1.导入包并生成相关对象

scala> import org.apache.spark.sql.SparkSession  //引入Spark Session包
scala> val spark=SparkSession.builder().getOrCreate()  //生成Spark Session对象名称为spark
scala> import spark.implicits._

2.读取文件

scala> val df = spark.read.json("file:///usr/local/spark/examples/src/main/resources/people.json")

scala>val peopleDF=spark.read.format("json").load("file:///usr/local/spark/examples/src/main/resources/people.json")

磁盘中有三类文件:.json文件 .parquet文件 .csv文件,都是以上的格式
3.写入文件

df.write.csv("file:///usr/local/spark/examples/src/main/resources/people.csv")

scala>df.write.format("csv").save("file:///usr/local/spark/examples/src/main/resources/people.csv")

磁盘中有三类文件:.json文件 .parquet文件 .csv文件,都是以上的格式
4.怎么保存为txt文件

scala> val peopleDF = spark.read.format("json").load("file:///usr/local/spark/examples/src/main/resources/people.json")
scala> peopleDF.select("name", "age").write.format("csv").save("file:///usr/local/spark/mycode/newpeople.csv")

//对保存后的文件进行println输出
scala> val textFile = sc.textFile("file:///usr/local/spark/mycode/newpeople.csv")
scala> textFile.foreach(println)
Justin,19
Michael,
Andy,30
scala> val peopleDF = spark.read.format("json").load("file:///usr/local/spark/examples/src/main/resources/people.json")

//我们不建议把DataFrame保存为txt,但也不是不可以这么做
scala> df.rdd.saveAsTextFile("file:///usr/local/spark/mycode/newpeople.txt")  

//对保存后的文件进行读取输出
scala> val textFile = sc.textFile("file:///usr/local/spark/mycode/newpeople.txt")
scala> textFile.foreach(println)
[null,Michael]
[30,Andy]
[19,Justin]

5.如何从txt中加载DataFrame
dataframe类型为什么建议存储为csv、json、parquet类型而不建议存储为txt类型呢?

当dataframe存储为txt文档的时候它就不是dataframe类型了,要把txt加载为dataframe需要经过三步“txt→rdd→dataframe”(先要加载txt为rdd,然后从rdd转化为dataframe才行)

我们之前讲了dataframe如何转为txt,那么如何加载txt为dataframe呢?(因为txt要转换为dataframe必定途经过txt→rdd→dataframe,所以凡是rdd→dataframe的都可以参照如下操作)

见 { 二、加载txt得到DataFrame}

6.常用的查找操作

scala> df.select(df("name"),df("age")+1).show()
scala> df.filter(df("age") > 20 ).show()
scala> df.groupBy("age").count().show()
scala> df.sort(df("age").desc).show()
scala> df.sort(df("age").desc, df("name").asc).show()
scala> df.select(df("name").as("username"),df("age")).show() //对列进行重命名
scala> val namesDF = spark.sql("SELECT * FROM parquetFile")
scala> namesDF.foreach(attributes =>println("Name: " + attributes(0)+"  favorite color:"+attributes(1)))

7.实例

scala> import org.apache.spark.sql.SparkSession  //引入Spark Session包
scala> val spark=SparkSession.builder().getOrCreate()  //生成Spark Session对象名称为spark
scala> import spark.implicits._
scala> val df = spark.read.json("file:///usr/local/spark/examples/src/main/resources/people.json")
scala> df.show()

二、加载txt得到DataFrame

在这里插入图片描述
一、当你提前知道txt里面包含name和age两个字段时—用提前定义一个case class的方式

scala> import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder
scala> import org.apache.spark.sql.Encoder
scala> import spark.implicits._  //导入包,支持把一个RDD隐式转换为一个DataFrame
scala> case class Person(name: String, age: Long)  //定义一个case class,里面包含name和age两个字段
scala> val peopleDF = spark.sparkContext.textFile("file:///usr/local/spark/examples/src/main/resources/people.txt").map(_.split(",")).map(attributes => Person(attributes(0), attributes(1).trim.toInt)).toDF()

当你要进行查询时:

scala> peopleDF.createOrReplaceTempView("people")  //必须注册为临时表才能供下面的查询使用
 
scala> val personsRDD = spark.sql("select name,age from people where age > 20")
//最终生成一个DataFrame
scala> personsRDD.map(t => "Name:"+t(0)+","+"Age:"+t(1)).show()  //DataFrame中的每个元素都是一行记录,包含name和age两个字段,分别用t(0)和t(1)来获取值
 
+------------------+
|             value|
+------------------+
|Name:Michael,Age:29|
|   Name:Andy,Age:30|
+------------------+

二、当你不知道txt里面包含什么字段时—使用编程方式定义RDD模式
当你不知道txt里面包含什么字段时,无法提前定义case class时,就需要采用编程方式定义RDD模式。

import org.apache.spark.sql.types._
import org.apache.spark.sql.Row


//加载文件生成 RDD
val peopleRDD = spark.sparkContext.textFile("file:///usr/local/spark/examples/src/main/resources/people.txt")

//制作一个含有"name"和"age"字段的表头,“StringType”就是说这一列是“String类型”,“nullable = true”就是允许这个字段存在空值(这个看你啊,要是这个字段是学生ID,那么你一般不会让ID这一列存在空置的)
val schema = StructType(
  StructField("name",StringType,nullable = true),
  StructField("age", StringType,nullable = true),
)

//制作表中记录,我们要把加载进来的RDD处理成类似于Row("Andy",30)这样式的
val rowRDD = peopleRDD.map(_.split(",")).map(attributes => Row(attributes(0), attributes(1).trim.toInt))  //Row是你导入的一个对象

//把“表头”和“表中记录”拼在一起
val peopleDF = spark.createDataFrame(rowRDD, schema)

//必须注册为临时表才能供下面查询使用
peopleDF.createOrReplaceTempView("people")
//进行查询
val results = spark.sql("SELECT name,age FROM people")
以下内容需要你实践后再进行背诵

三、读取和保存数据

猜你喜欢

转载自blog.csdn.net/weixin_45014721/article/details/109802952
今日推荐