SQLContext
查看SQLContext类的源码发现这个类的主构造器中的参数就是一个sparkSession实例。
class SQLContext private[sql] (val sparkSession : org.apache.spark.sql.SparkSession)
此外可以看到另外两个辅助构造器参数都是SparkContext的实例。
def this(sc : org.apache.spark.SparkContext) = { /* compiled code / }
def this(sparkContext : org.apache.spark.api.java.JavaSparkContext) = { / compiled code */ }
除了这些,剩下的就是以各种数据源创建DataFrame的方法以及sql()方法。这就是说DataFrame类并没有sql()这个方法,sql方法时SQLContext类中的。正确的开发顺序是将DataFrame注册为一张表(table)或者视图(View)。然后通过SQLContext的实例调用sql()方法在sql的参数中是操作前面注册的表的sql语句。
SparkSession
先看看SparkSession的部分源码发先主构造器的参数是一个SparkContext对象。
class SparkSession private (@scala.transient val sparkContext : org.apache.spark.SparkContext, @scala.transient private val existingSharedState : scala.Option[org.apache.spark.sql.internal.SharedState])
剩下的也是各种方式创建DataFrame的方法以及sql()方法。也就是说sql()是SparkSession对象提供的方法。
接下来在此贴出官网给的一个小emo
import spark.implicits._
//读取指定目录下的文件
val peopleDF = spark.read.json("examples/src/main/resources/people.json")
// 将读取的文件类容以parquet文件形式保存在指定目录下
peopleDF.write.parquet("people.parquet")
//读取指定目录下的parquet文件并形成DataFrame
val parquetFileDF = spark.read.parquet("people.parquet")
//将DataFrame注册为一张临时的视图
parquetFileDF.createOrReplaceTempView("parquetFile")
//以sql形式获取目标字段类容形成一个DataFrame
val namesDF = spark.sql("SELECT name FROM parquetFile WHERE age BETWEEN 13 AND 19")
namesDF.map(attributes => "Name: " + attributes(0)).show()
另外在给出一段将mysql中的数据迁移到hdfs的案例代码
import org.apache.spark.sql.SparkSession
object import_data {
def main(args: Array[String]): Unit = {
val spark = SparkSession .builder()
.appName("MysqlApp")
.master("local[2]").getOrCreate()
val jdbcDF = spark.read.format("jdbc")
.option("delimiter", ",")
.option("heard", true)
.option("url", "jdbc:mysql://ip:xxxx/test?useUnicode=true&characterEncoding=utf-8")
.option("db_table", "cust")
.option("user", "root").option("password", "000000").load()
val res=jdbcDF.write.format("csv").option("delimiter", ",")
.option("heard", true).save("hdfs://ip:xxxx/a.parquet")
}
}
val jdbcDF = spark.read
.format("jdbc")
.option("url", "jdbc:postgresql:dbserver")
.option("dbtable", "schema.tablename")
.option("user", "username")
.option("password", "password")
.load()
val connectionProperties = new Properties()
connectionProperties.put("user", "username")
connectionProperties.put("password", "password")
val jdbcDF2 = spark.read
.jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties)
// Saving data to a JDBC source
jdbcDF.write
.format("jdbc")
.option("url", "jdbc:postgresql:dbserver")
.option("dbtable", "schema.tablename")
.option("user", "username")
.option("password", "password")
.save()
jdbcDF2.write
.jdbc("jdbc:postgresql:dbserver", "schema.tablename", connectionProperties)