Sparksql简单梳理

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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值