spark sql 操作
DSL风格语法
1、查看DataFrame中的内容
scala> df1.show
+---+--------+---+
| id| name|age|
+---+--------+---+
| 1|zhansgan| 16|
| 2| lisi| 18|
| 3| wangwu| 21|
| 4|xiaofang| 22|
+---+--------+---+
2、查看DataFrame部分列的数据
scala> df1.select(df1.col("name")).show
+--------+
| name|
+--------+
|zhansgan|
| lisi|
| wangwu|
|xiaofang|
+--------+
scala> df1.select(col("name"), col("age")).show
+--------+---+
| name|age|
+--------+---+
|zhansgan| 16|
| lisi| 18|
| wangwu| 21|
|xiaofang| 22|
+--------+---+
scala> df1.select("name").show
+--------+
| name|
+--------+
|zhansgan|
| lisi|
| wangwu|
|xiaofang|
+--------+
3、查看DataFrame schema信息
scala> df1.printSchema
root
|-- id: integer (nullable = false)
|-- name: string (nullable = true)
|-- age: integer (nullable = false)
4、查询name和age并将age + 1
scala> df1.select(col("name"), col("age") + 1).show
+--------+---------+
| name|(age + 1)|
+--------+---------+
|zhansgan| 17|
| lisi| 19|
| wangwu| 22|
|xiaofang| 23|
+--------+---------+
scala> df1.select(df1("name"), df1("age") + 1).show
+--------+---------+
| name|(age + 1)|
+--------+---------+
|zhansgan| 17|
| lisi| 19|
| wangwu| 22|
|xiaofang| 23|
+--------+---------+
5、过滤年龄大于20的人
scala> df1.filter(col("age") > 20).show
+---+--------+---+
| id| name|age|
+---+--------+---+
| 3| wangwu| 21|
| 4|xiaofang| 22|
+---+--------+---+
6、按年龄分组,并统计年龄相同的人数
scala> df1.groupBy("age").count().show
+---+-----+
|age|count|
+---+-----+
| 16| 1|
| 18| 1|
| 21| 1|
| 22| 1|
+---+-----+
SQL风格
在使用SQL风格前,首先需要将DataFrame注册成表
df1.registerTempTable("t_person")
1、查询年龄最大的前两个人
scala> sqlContext.sql("select * from t_person order by age desc limit 2").show
+---+--------+---+
| id| name|age|
+---+--------+---+
| 4|xiaofang| 22|
| 3| wangwu| 21|
+---+--------+---+
2、显示表的schema信息
scala> sqlContext.sql("desc t_person").show
+--------+---------+-------+
|col_name|data_type|comment|
+--------+---------+-------+
| id| int| |
| name| string| |
| age| int| |
+--------+---------+-------+
DataFrame api 操作
package bigdata.spark.sql import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkContext, SparkConf} import scala.reflect.internal.util.TableDef.Column /**
* Created by Administrator on 2017/4/27.
*/
object SparkSqlDemo { def main(args: Array[String]) {
val conf = new SparkConf()
conf.setAppName("SparkSqlDemo")
conf.setMaster("local")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val rdd1 = sc.textFile("hdfs://m1:9000/persons.txt").map(_.split(" "))
val rdd2 = rdd1.map(x => Person(x(0).toInt, x(1), x(2).toInt)) // 导入隐式转换,里面包含了RDD隐式转换为DataFrame的方法
import sqlContext.implicits._
// df1现在已经是DataFrame了
val df1 = rdd2.toDF
df1.show df1.select("age").show() df1.select(col="age").show
df1.select(df1.col("age")).show import df1._
df1.select(col("age")).show df1.select(col("age") > 20).show df1.select(col("age") + 1).show df1.filter(col("age") > 20).show() df1.registerTempTable("t_person") sqlContext.sql("select * from t_person").show() sqlContext.sql("select * from t_person order by age desc limit 2").show() sc.stop() } // 这个类必须放在main方法外面,不然的话会报错
case class Person(id:Int, name:String, age:Int) }
StructType指定Schema
package bigdata.spark.sql
import org.apache.spark.sql.types.{StringType, IntegerType, StructField, StructType}
import org.apache.spark.sql.{Row, SQLContext}
import org.apache.spark.{SparkContext, SparkConf}
import scala.reflect.internal.util.TableDef.Column
/**
* Created by Administrator on 2017/4/27.
*/
object SparkSqlDemo {
def main(args: Array[String]) {
val conf = new SparkConf()
conf.setAppName("SparkSqlDemo")
conf.setMaster("local")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val rdd1 = sc.textFile("hdfs://m1:9000/persons.txt").map(_.split(" "))
val rdd2 = rdd1.map(x => Row(x(0).toInt, x(1), x(2).toInt))
// 创建schema
val schema = StructType(
List(
// 名称 类型 是否可以为空
StructField("id", IntegerType, false),
StructField("name", StringType, false),
StructField("age", IntegerType, false)
)
)
// 创建DataFrame
val df1 = sqlContext.createDataFrame(rdd2, schema)
df1.registerTempTable("t_person")
sqlContext.sql("select * from t_person").show()
sc.stop()
}
}
spark sql操作关系型数据库
spark sql可以从关系型数据库读入数据创建DataFrame,也可以写数据到关系型数据库
1、创建数据库
CREATE DATABASE spark DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
2、创建person表
create table person(id int, name varchar(200), age int);
3、spark 操作关系型数据库
package bigdata.spark.sql
import java.util.Properties
import org.apache.spark.sql.types.{StringType, IntegerType, StructField, StructType}
import org.apache.spark.sql.{SaveMode, Row, SQLContext}
import org.apache.spark.{SparkContext, SparkConf}
import scala.reflect.internal.util.TableDef.Column
/**
* Created by Administrator on 2017/4/27.
*/
object SparkSqlDemo {
def main(args: Array[String]) {
val conf = new SparkConf()
conf.setAppName("SparkSqlDemo")
conf.setMaster("local")
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
val rdd1 = sc.textFile("hdfs://m1:9000/persons.txt").map(_.split(" "))
val rdd2 = rdd1.map(x => Row(x(0).toInt, x(1), x(2).toInt))
// 创建schema
val schema = StructType(
List(
// 名称 类型 是否可以为空
StructField("id", IntegerType, false),
StructField("name", StringType, false),
StructField("age", IntegerType, false)
)
)
val props = new Properties()
props.put("user", "root")
props.put("password", "root")
// 创建DataFrame
val df1 = sqlContext.createDataFrame(rdd2, schema)
// 以追加的模式写入数据库
df1.write.mode(SaveMode.Append).jdbc("jdbc:mysql://m1:3306/spark", "person", props)
// 从数据库中读数据
sqlContext.read.jdbc("jdbc:mysql://m1:3306/spark", "person", props).show()
sc.stop()
}
}
spark sql 操作的更多相关文章
- spark2.3.0 配置spark sql 操作hive
spark可以通过读取hive的元数据来兼容hive,读取hive的表数据,然后在spark引擎中进行sql统计分析,从而,通过spark sql与hive结合实现数据分析将成为一种最佳实践.配置步骤 ...
- Spark SQL 操作Hive 数据
Spark 2.0以前版本:val sparkConf = new SparkConf().setAppName("soyo") val spark = new SparkC ...
- Spark SQL 之 Data Sources
#Spark SQL 之 Data Sources 转载请注明出处:http://www.cnblogs.com/BYRans/ 数据源(Data Source) Spark SQL的DataFram ...
- Spark 官方文档(5)——Spark SQL,DataFrames和Datasets 指南
Spark版本:1.6.2 概览 Spark SQL用于处理结构化数据,与Spark RDD API不同,它提供更多关于数据结构信息和计算任务运行信息的接口,Spark SQL内部使用这些额外的信息完 ...
- Spark SQL 官方文档-中文翻译
Spark SQL 官方文档-中文翻译 Spark版本:Spark 1.5.2 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 Data ...
- 【转载】Spark SQL之External DataSource外部数据源
http://blog.csdn.net/oopsoom/article/details/42061077 一.Spark SQL External DataSource简介 随着Spark1.2的发 ...
- 大数据技术之_19_Spark学习_03_Spark SQL 应用解析 + Spark SQL 概述、解析 、数据源、实战 + 执行 Spark SQL 查询 + JDBC/ODBC 服务器
第1章 Spark SQL 概述1.1 什么是 Spark SQL1.2 RDD vs DataFrames vs DataSet1.2.1 RDD1.2.2 DataFrame1.2.3 DataS ...
- 第十一篇:Spark SQL 源码分析之 External DataSource外部数据源
上周Spark1.2刚发布,周末在家没事,把这个特性给了解一下,顺便分析下源码,看一看这个特性是如何设计及实现的. /** Spark SQL源码分析系列文章*/ (Ps: External Data ...
- Spark SQL之External DataSource外部数据源(二)源代码分析
上周Spark1.2刚公布,周末在家没事,把这个特性给了解一下,顺便分析下源代码,看一看这个特性是怎样设计及实现的. /** Spark SQL源代码分析系列文章*/ (Ps: External Da ...
随机推荐
- Ubuntu「一键」设置全局代理
Ubuntu「一键」设置代理 sonictl note: the DNS problem may be still there. Except proxychains. WSL (Windows Su ...
- django快速搭建blog
python版本:3.5.4: Django版本:2.0 创建项目 创建mysite项目和 blog应用: django-admin startproject mysite # 创建mysite项目 ...
- sh_04_qq号码
sh_04_qq号码 # 1. 定义一个变量记录 QQ 号码 qq_number = " # 2. 定义一个变量记录 QQ 密码 qq_password = " # 注意:在使用解 ...
- Windows10主机插入耳机只有一边有声音
Windows10主机插入耳机只有一边有声音 在网上看了好几个版本,排除了主机插孔和耳机本身的问题,根据一篇文章在声音设置中找到了答案,原文章不是windows10,所以我找了好一会才找到,所以特地写 ...
- 转:SqlBulkCopy类进行大数据(一万条以上)插入测试
转自:https://www.cnblogs.com/LenLi/p/3903641.html 结合博主实例,自己测试了一下,把数据改为3万行更明显!! 关于上一篇博客中提到的,在进行批量数据插入数据 ...
- G-sensor概述及常用概念整理【转】
本文转载自:http://www.jianshu.com/p/d471958189a0?nomobile=yesG 本文对G-sensor进行整理,先介绍G-sensor的一些基本概念,再具体讲解BO ...
- oracle 表连接 - nested loop 嵌套循环连接
一. nested loop 原理 nested loop 连接(循环嵌套连接)指的是两个表连接时, 通过两层嵌套循环来进行依次的匹配, 最后得到返回结果集的表连接方法. 假如下面的 sql 语句中表 ...
- 模拟赛DAY1 T2腐草为萤
2.腐草为萤(dzy.cpp/c) [题目背景] 纤弱的淤泥中妖冶颓废在季夏第三月最幼嫩的新叶连凋零都不屑何必生离死别——银临<腐草为萤> [问题描述] 扶苏给了你一棵树,这棵树上长满了幼 ...
- principal components analysis 主成份分析
w http://deeplearning.stanford.edu/wiki/index.php/主成份分析 主成分分析(PCA)及其在R里的实现 - jicf的日志 - 网易博客 http:// ...
- JS new date在IOS出现的问题
实例代码: input = input.replace(/\-/g, "/");//横杠的时间不能被识别,所以要替换程斜杠 let time = new Date(input); ...