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")
次の内容は練習後に暗唱する必要があります |