第3章:「Spark-SparkSQL」の概要

1つは、ファイルから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ファイル、寄木細工のファイル、csvファイルの3種類のファイルがあり、すべて上記の形式になっています。
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ファイル、寄木細工のファイル、csvファイルの3種類のファイルがあり、すべて上記の形式になっています。
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をロードする方法
データフレームタイプをtxtタイプではなく、csv、json、parquetとして保存することが推奨されるのはなぜですか?

データフレームがtxtドキュメントとして保存されている場合、データフレームタイプではありません。txtをデータフレームとしてロードするには、「txt→rdd→dataframe」(最初にtxtをrddとしてロードし、次にrddからデータフレームに変換する)の3つの手順が必要です。 )

データフレームをtxtに変換する方法について話しましたが、txtをデータフレームとしてロードする方法は?(txtはtxt→rdd→dataframeを介してデータフレームに変換する必要があるため、すべてのrdd→dataframeは次の操作を参照できます)

{ 2.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()

2.txtをロードしてDataFrameを取得します

ここに画像の説明を挿入します
1. txtにnameとageという名前の2つのフィールドが含まれていることが事前にわかっている場合は、事前にケースクラスを定義する方法を使用してください

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

2. txtに含まれるフィールドがわからない場合—プログラムでRDDモードを定義します。txtに含まれるフィールドが
わからず、ケースクラスを事前に定義できない場合は、プログラムで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")
次の内容は練習後に暗唱する必要があります

3、データの読み取りと保存

おすすめ

転載: blog.csdn.net/weixin_45014721/article/details/109802952