Capítulo 3: Resumen de "Spark-Spark SQL"

Uno, genera un DataFrame a partir de un archivo

1. Importe el paquete y genere objetos relacionados

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

2. Leer el archivo

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

o

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

Hay tres tipos de archivos en el disco: archivos .json, archivos parquet y archivos csv, todos en el formato anterior.
3. Escribir en archivo

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

o

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

Hay tres tipos de archivos en el disco: archivos .json, archivos parquet y archivos csv, todos en el formato anterior.
4. Cómo guardar como archivo 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. Cómo cargar DataFrame desde txt
¿Por qué se recomienda almacenar el tipo de marco de datos como csv, json, parquet y no como tipo txt?

Cuando el marco de datos se almacena como un documento txt, no es un tipo de marco de datos. Para cargar txt como un marco de datos, se requieren tres pasos: "txt → rdd → dataframe" (primero cargue txt como rdd, y luego convierta de rdd a dataframe )

Hablamos sobre cómo convertir dataframe a txt, entonces, ¿cómo cargar txt como dataframe? (Debido a que txt debe convertirse a marco de datos a través de txt → rdd → marco de datos, por lo que todos los marcos de datos rdd → pueden referirse a las siguientes operaciones)

Consulte { 2. Cargar txt para obtener DataFrame }.

6. Operaciones de búsqueda más utilizadas

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. Ejemplos

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()

2. Cargue txt para obtener DataFrame

Inserte la descripción de la imagen aquí
1. Cuando sepa de antemano que el txt contiene dos campos denominados nombre y edad, utilice la forma de definir una clase de caso por adelantado.

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()

Cuando desee realizar una consulta:

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|
+------------------+

2. Cuando no sepa qué campos están incluidos en txt, defina el modo RDD mediante programación
Cuando no sepa qué campos están incluidos en txt y no pueda definir la clase de caso por adelantado, debe definir el modo RDD mediante programación.

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")
El siguiente contenido necesita que lo recites después de la práctica.

Tres, leer y guardar datos

Supongo que te gusta

Origin blog.csdn.net/weixin_45014721/article/details/109802952
Recomendado
Clasificación