Spark SQL 学习笔记

目录

SQLContext

1.初始化SparkContext命令

2.创建SQLContext命令:

(1)Spark中使用toDF函数创建DataFrame

(2)创建Case Class

(3)使用选择(select)方法

(4)过滤器(filter)方法

(5)分组(groupby)方法

(6)将DataFrame数据存储在表中

(7)表上传递sql查询    

显示记录

 子句SQL查询数据帧

3.创建RDD、拷贝、修改

4.阅读JSON文档


SQLContext

SQLContext是一个类,用于初始化Spark SQL的功能。Spark SQL提供对读取和写入自动捕获原始数据模式的镶木地板文件的支持。

1.初始化SparkContext命令

        进入spark bin目录中,输入:spark-shell,SparkContext对象在spark-shell启动时用namesc初始化(默认)。

D:\spark-2.4.3-bin-hadoop2.7\bin> spark-shell

显示:

如上所示,出现scala,表示成功进入scala。

2.创建SQLContext命令:

scala> val sqlcontext = new org.apache.spark.sql.SQLContext(sc)

显示:           
            

(1)Spark中使用toDF函数创建DataFrame

//命令生成SQLContext,scmeans是SparkContext对象.
scala> val sqlcontext = new org.apache.spark.sql.SQLContext(sc)

//用于将RDD隐式转换为DataFrame的所有SQL函数
scala> import sqlcontext.implicits._

scala> val df = Seq(
   (1, "First datetime", java.sql.Date.valueOf("2019-08-01")),
   (2, "Last datatime", java.sql.Date.valueOf("2019-08-30"))
 ).toDF("index", "string_column", "date_column")

//查看数据
scala> df.show

//查看DataFrame的Structure(Schema)
scala> df.printSchema()

显示:

 

 

Spark读取本地TXT文件创建DataFrame

通过使用以下命令从名为ceshi.txt的文本文件读取数据来创建RDD DataFrame。

scala> val sqlcontext = new org.apache.spark.sql.SQLContext(sc)

scala> import sqlcontext.implicits._

scala> val people = sc.textFile("E:\\ceshi.txt").map(_.split(",")).toDF()

scala> people.show

注:.map(_.split(“,”)):将文本记录分割成字段。
       toDF()方法:用于将具有模式的案例类对象转换为DataFrame。
显示:

(2)创建Case Class

必须使用案例类定义记录数据的模式。 以下命令用于根据给定数据(id,name,num)声明Case Class。

scala> case class Csl(id:Int,name:String,num:Int)

显示:

以下命令生成RDD namedemplby,从ceshi.txt中读取数据并使用Map函数将其转换为DataFrame。

scala> val empl=sc.textFile("E:\\ceshi.txt").map(_.split(",")).map(c => Csl(c(0).trim.toInt,c(1),c(2).trim.toInt)).toDF()

注:.map(_.split(“,”)):将文本记录分割成字段;
       .map(_.split(",")).map(c => Csl(c(0).trim.toInt,c(1),c(2).trim.toInt)):将单个字段(id,name,num)转换为一个case类对象;
       toDF():将具有模式的案例类对象转换为DataFrame。

显示:

(3)使用选择(select)方法

       查看date_column列的值

scala> df.select("date_column").show

显示:

(4)过滤器(filter)方法

        过滤int_column列大于1的数据

scala> df.filter(df("int_column") > 1).show

显示:

(5)分组(groupby)方法

scala> df.groupBy("int_column").count().show

显示:

(6)将DataFrame数据存储在表中

        将DataFrame数据存储到名为ceshi的表中。

scala> empl.registerTempTable("ceshi")
warning: there was one deprecation warning; re-run with -deprecation for details

(7)表上传递sql查询    

显示记录

使用SQLContext.sql()方法在表上传递一些sql查询,选择DataFrame上的查询,使用命令从theemployableable中选择所有记录。 这里,我们使用变量allrecords来捕获所有记录数据。 显示记录,调用show()。 

scala> val allrecords = sqlContext.sql("SELECT * FROM ceshi")
allrecords: org.apache.spark.sql.DataFrame = [id: int, name: string ... 1 more field]

scala> allrecords.show()
+---+----------+---+
| id|      name|num|
+---+----------+---+
|  1|water game| 12|
|  2|      swim| 16|
|  3|      wind| 64|
|  1|      game| 38|
+---+----------+---+

 子句SQL查询数据帧

          where语句,条件查询

scala> val numfilter = sqlContext.sql("SELECT * FROM ceshi WHERE num>20")
numfilter: org.apache.spark.sql.DataFrame = [id: int, name: string ... 1 more field]

scala> numfilter.show
+---+----+---+
| id|name|num|
+---+----+---+
|  3|wind| 64|
|  1|game| 38|
+---+----+---+

         对其应用Transform来从结果DataFrame获取数据。
使用列索引从numfilter 数据帧获取id值 

scala> numfilter.map(t=>"id: "+t(0)).collect().foreach(println)
id: 3
id: 1

3.创建RDD、拷贝、修改

        Spark最主要的抽象是叫Resilient Distributed Dataset(RDD)的弹性分布式集合。RDDs可以使用Hadoop InputFormats(例如HDFS文件)创建,也可以从其他的RDDs转换。在Spark源代码目录里从README.md文本文件中创建一个新的RDD。

scala> val textFile = sc.textFile("file:///home/hadoop/hadoop/spark/README.md")

 

注:1)file代表本地目录;

       2)file后三个斜杠(/);

       3)“/home/hadoop/hadoop/spark/README.md”是spark安装目录,可替换。

显示:

       在spark目录/conf文件夹下,此时有一个名为log4j.properties.template的文件

scala> cp log4j.properties.template log4j.properties
scala> vim log4j.properties

  

4.阅读JSON文档

scala> spark-shell
scala> val sqlContext = new org.apache.spark.sql.SQLContext(sc)
scala> val df = sqlContext.read.json("E:\\ceshi.json")
scala> df.show
scala> df.dfs.printSchema()

显示: 

scala> val sqlContext = new org.apache.spark.sql.SQLContext(sc)
warning: there was one deprecation warning; re-run with -deprecation for details
sqlContext: org.apache.spark.sql.SQLContext = org.apache.spark.sql.SQLContext@3531509c

scala> val dfs = sqlContext.read.json("E:\\ceshi.json")
dfs: org.apache.spark.sql.DataFrame = [_corrupt_record: string, gender : string ... 2 more fields]

scala> dfs.show
+---------------+-------+----+-----+
|_corrupt_record|gender |  id| name|
+---------------+-------+----+-----+
|              {|   null|null| null|
|           null|   male|   1|  Jim|
|           null| female|   2| Tina|
|           null| female|   3| Ella|
|           null|   male|   4|Jerry|
|           null|   male|   5|Smith|
|              }|   null|null| null|
+---------------+-------+----+-----+


scala> val dfs = sqlContext.read.json("E:\\ceshi.json")
dfs: org.apache.spark.sql.DataFrame = [gender : string, id: string ... 1 more field]

scala> dfs.show
+-------+---+-----+
|gender | id| name|
+-------+---+-----+
|   male|  1|  Jim|
| female|  2| Tina|
| female|  3| Ella|
|   male|  4|Jerry|
|   male|  5|Smith|
+-------+---+-----+


scala>  dfs.printSchema()
root
 |-- gender : string (nullable = true)
 |-- id: string (nullable = true)
 |-- name: string (nullable = true)

5.HiveContext

       Hive与Spark库捆绑为HiveContext,它继承自SQLContext。 使用HiveContext在HiveMetaStore中创建和查找表,并使用HiveQL在其上写入查询。 没有现有Hive部署的用户仍然可以创建HiveContext。 当未有hive-site.xml配置时,上下文会自动在当前目录中创建名为metastore_db的元数据库和名为warehouse的文件夹。

启动Spark Shell

scala> spark-shell

HiveContext初始化到Spark Shell中,创建SQLContext对象

scala> val sqlContext = new org.apache.spark.sql.hive.HiveContext(sc)

 在路径D:\spark-2.4.3-bin-hadoop2.7\bin 下产生metastore_db的元数据库和名为warehouse的文件夹

HiveQL创建表

使用HiveQL语法的Create语句,创建表ceshi。

sacal> sqlContext.sql("CREATE TABLE IF NOT EXISTS ceshi(id INT, name STRING,gender SING, age INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'")

HiveQL将数据加载到表中 

使用以下命令将记录数据加载到表中。如果成功执行,给定的ceshi.txt中的记录将按照模式存储在表ceshi中。

sacal> sqlContext.sql("LOAD DATA LOCAL INPATH 'E:\\ceshi.txt' INTO TABLE ceshi")

从表中选择字段 

使用HiveQL select查询获取所有记录。

scala> val df = sqlContext.sql(" SELECT id, name, gender, age FROM ceshi")
scala>df.show

Spark SQL - Parquet文件

Parquet是一种柱状格式,许多数据处理系统支持。

柱状存储的优点 :

1、列存储限制IO操作。

2、列式存储可以获取您需要访问的特定列。

3、列式存储占用更少的空间。

4、列式存储提供更好的摘要数据,并遵循类型特定的编码

打开Spark Shell 

scala> spark-shell

创建SQLContext对象 

sc表示SparkContext对象。

scala> val sqlContext = new org.apache.spark.sql.SQLContext(sc)

从文本文件读取输入

从名为ceshi.parquet的parquet文件读取数据来创建RDD DataFrame。

scala> val parqfile = sqlContext.read.parquet(“ceshi.parquet”)

将DataFrame存储到表中 

将DataFrame数据存储到名为employee的表中。

scala> parqfile.registerTempTable(“employee”)

使用SQLContext.sql()方法在表上传递SQL查询。
选择DataFrame上的查询
从employee表中选择所有记录。

scala> val allrecords = sqlContext.sql("SELeCT * FROM employee")
scala> allrecords.show

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值