Spark SQL操作外部数据源

一、Spark SQL

  • Spark SQL是Spark的核心组件之一(2014.4 Spark1.0)
  • 能够直接访问现存的Hive数据
  • 提供JDBC/ODBC接口供第三方工具借助Spark进行数据处理
  • 提供了更高层级的接口方便地处理数据
  • 支持多种操作方式:SQL、API编程
  • 支持多种外部数据源:Parquet、JSON、RDBMS等

在这里插入图片描述

  • SparkContext
  • SQLContext
    Spark SQL的编程入口
  • HiveContext
    SQLContext的子集,包含更多功能
  • SparkSession(Spark 2.x推荐)
    1) SparkSession:合并了SQLContext与HiveContext
    2)提供与Spark功能交互单一入口点,并允许使用DataFrame和Dataset API对Spark进行编程

二、Parquet文件

Parquet文件 是一种列式存储格式,以二进制存储,文件中包含数据和元数据

idea代码

//写parquet文件
import org.apache.spark.sql.{Row, SparkSession}
import org.apache.spark.sql.types._

object ParDemo {
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.builder()
    .master("local[*]")
    .appName("parquetDemo")
    .getOrCreate()

    val sc = spark.sparkContext

    val list = List(
      ("张三", "red", Array(3, 4, 5)),
      ("李四", "black", Array(13, 14, 55)),
      ("王五", "orange", Array(23, 64, 45)),
      ("赵六", "blue", Array(33, 34, 35))
    )
    val rdd = sc.parallelize(list)

    //定义表结构
    val schema = StructType(
      Array(
        StructField("name",StringType),
        StructField("color",StringType),
        StructField("num",ArrayType(IntegerType))
      )
    )

    val rowRdd = rdd.map(x => Row(x._1,x._2,x._3))

    val df = spark.createDataFrame(rowRdd,schema)
    //写parquet文件
    df.write.parquet("out/color")


	//读取
	val frame = spark.read.parquet("out/color")
	frame.printSchema()
	frame.show()
    }
}

三、hive数据

  1. 将hive的hive-site.xml拷贝到spark的conf中
  2. mysqlConnect的jar包到jars中
  3. 在hive中建立表

方式一
直接spark-shell中操作:

//在spark中输入命令
val df = spark.table("表名")

在这里插入图片描述
注:默认default库,可以用 “库名.表名” 的方式

方式二:使用idea操作

//pom中导入依赖
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-hive_2.11</artifactId>
      <version>2.1.1</version>
    </dependency>
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.36</version>
    </dependency>


//代码部分
val spark = SparkSession.builder()
    .master("local[*]")
    .appName("onHive")
    .config("hive.metastore.uris","thrift://hadoop001:9083")
    .enableHiveSupport()
    .getOrCreate()


spark.sql("show databases").show

  //spark默认连接hive的Default库
val df=spark.sql("select * from toronto")
val ds = df.where(df("ssn").startsWith("158"))
val ds2 = df.filter(df("ssn").startsWith("111"))
ds.show()
ds2.show()

运行前需要先启动该metastore

nohup hive --service metastore &

在这里插入图片描述

四、MySql数据

方式一:直接在spark中操作

//更换需要连接的主机ip地址或主机名,表名,用户名密码
val url="jdbc:mysql://hadoop001:3306/hive"
val tbname="TBLS"
val prop=new java.util.Properties
prop.setProperty("user","root")
prop.setProperty("password","ok")
prop.setProperty("driver","com.mysql.jdbc.Driver")
val jdbcDF = spark.read.jdbc(url,tbname,prop)
jdbcDF.show

在这里插入图片描述

方式二:idea连接

val spark = SparkSession.builder()
  .master("local[*]")
  .appName("onMysql").getOrCreate()

val url="jdbc:mysql://hadoop001:3306/school"
val user="root"
val password="ok"
val driver="com.mysql.jdbc.Driver"
val prop=new Properties()
prop.setProperty("user",user)
prop.setProperty("password",password)
prop.setProperty("driver",driver)
val df = spark.read.jdbc(url,"Score",prop)

df.show()

val cnt = df.where(df("s_score").startsWith("8")).count()
println(cnt)  // 7

val frame = df.groupBy("s_id").count().show()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值