第一种方式:Spark SQL可以将数据文件加载成RDD方式,然后将RDD转成DataFrame或者DataSet。
第二种方式:从本地或者Cloud(hdfs hive S3等)
将文件加载成RDD
首先打开控制台,输入命令打开spark-shell
:
./spark-shell --master local[2] --jars /home/iie4bu/software/mysql-connector-java-5.1.35.jar
然后加载本地文件:
val masterlog = sc.textFile("file:///home/iie4bu/app/spark-2.4.5-bin-2.6.0-cdh5.15.1/logs/spark-iie4bu-org.apache.spark.deploy.master.Master-1-manager.out.2")
此时已经将本地文件加载成RDD了,还无法使用SQL进行查询,因为没有转成DataFrame。
将RDD转成DataFrame
import org.apache.spark.sql.Row
val masterRDD = masterlog.map(x => Row(x))
import org.apache.spark.sql.types._
val schemaString = "line"
val fields = schemaString.split(" ").map(fieldName => StructField(fieldName, StringType, nullable = true))
val schema = StructType(fields)
val masterDF = spark.createDataFrame(masterRDD, schema)
masterDF.printSchema
masterDF.show
这样就可以使用DataFrame中的相关查询了。也可以将DataFrame注册成一张表。
将DataFrame注册成表
masterDF.createOrReplaceTempView("master_logs")
spark.sql("select * from master_logs limit 10").show(false)
如果使用JSON或者Parquet,schema信息不需要手写,spark可以进行推测
使用Spark导入外部数据源,这种方式不需要手动写schema了:
val usersDF = spark.read.format("parquet").load("file:///home/iie4bu/app/spark-2.4.5-bin-2.6.0-cdh5.15.1/examples/src/main/resources/users.parquet")
usersDF.printSchema
生成DataFrame之后,也可以使用创建表来执行sql:
usersDF.createOrReplaceTempView("users_info")
spark.sql("select * from users_info where name = 'Ben'").show
更简单的实现方式
spark.sql("select * from parquet.`file:///home/iie4bu/app/spark-2.4.5-bin-2.6.0-cdh5.15.1/examples/src/main/resources/users.parquet` where name = 'Ben'").show
读取hdfs或者s3数据
读取成RDD:
val hdfsRDD = sc.textFile("hdfs://path/file")
val s3RDD = sc.textFile("s3a://bucket/object")
直接读取成DataFrame:
spark.read.format("text").load("hdfs://path/file")
spark.read.format("text").load("s3a://bucket/object")