一、从文件中生成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")
以下内容需要你实践后再进行背诵 |