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 操作的更多相关文章

  1. spark2.3.0 配置spark sql 操作hive

    spark可以通过读取hive的元数据来兼容hive,读取hive的表数据,然后在spark引擎中进行sql统计分析,从而,通过spark sql与hive结合实现数据分析将成为一种最佳实践.配置步骤 ...

  2. Spark SQL 操作Hive 数据

    Spark 2.0以前版本:val sparkConf = new SparkConf().setAppName("soyo")    val spark = new SparkC ...

  3. Spark SQL 之 Data Sources

    #Spark SQL 之 Data Sources 转载请注明出处:http://www.cnblogs.com/BYRans/ 数据源(Data Source) Spark SQL的DataFram ...

  4. Spark 官方文档(5)——Spark SQL,DataFrames和Datasets 指南

    Spark版本:1.6.2 概览 Spark SQL用于处理结构化数据,与Spark RDD API不同,它提供更多关于数据结构信息和计算任务运行信息的接口,Spark SQL内部使用这些额外的信息完 ...

  5. Spark SQL 官方文档-中文翻译

    Spark SQL 官方文档-中文翻译 Spark版本:Spark 1.5.2 转载请注明出处:http://www.cnblogs.com/BYRans/ 1 概述(Overview) 2 Data ...

  6. 【转载】Spark SQL之External DataSource外部数据源

    http://blog.csdn.net/oopsoom/article/details/42061077 一.Spark SQL External DataSource简介 随着Spark1.2的发 ...

  7. 大数据技术之_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 ...

  8. 第十一篇:Spark SQL 源码分析之 External DataSource外部数据源

    上周Spark1.2刚发布,周末在家没事,把这个特性给了解一下,顺便分析下源码,看一看这个特性是如何设计及实现的. /** Spark SQL源码分析系列文章*/ (Ps: External Data ...

  9. Spark SQL之External DataSource外部数据源(二)源代码分析

    上周Spark1.2刚公布,周末在家没事,把这个特性给了解一下,顺便分析下源代码,看一看这个特性是怎样设计及实现的. /** Spark SQL源代码分析系列文章*/ (Ps: External Da ...

随机推荐

  1. 【leetcode】1106. Parsing A Boolean Expression

    题目如下: Return the result of evaluating a given boolean expression, represented as a string. An expres ...

  2. 用vue构建项目同一局域网下通过ip访问

    在webpack配置文件下改为 host:'0.0.0.0' 改为后启动跳转不到登录页面 需手动修改浏览器上的0.0.0.0:8080为自己ip加上:8080 就可以在别的电脑上进行访问了 举一反三: ...

  3. python+requests接口自动化框架

    为什么要做接口自动化框架 1.业务与配置的分离 2.数据与程序的分离:数据的变更不影响程序 3.有日志功能,实现无人值守 4.自动发送测试报告 5.不懂编程的测试人员也可以进行测试 正常接口测试的流程 ...

  4. sublime格式化

    https://nodejs.org/dist/v6.2.0/node-v6.2.0-x64.msi sublime格式化

  5. 【PowerOJ1754&网络流24题】负载平衡问题(费用流)

    题意: 思路: [问题分析] 转化为供求平衡问题,用最小费用最大流解决. [建模方法] 首先求出所有仓库存货量平均值,设第i个仓库的盈余量为A[i],A[i] = 第i个仓库原有存货量 - 平均存货量 ...

  6. RabbitMQ消费端ACK与重回队列机制,TTL,死信队列详解(十一)

    消费端的手工ACK和NACK 消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿. 如果由于服务器宕机等严重问题,那么我们就需要手工进行ACK保障消费端成功. 消费端重回队列 ...

  7. 学习日记15-1布局页同时引用多个model

    @model Tuple<model1,model2>  mvc布局页同时引用多个model 使用m.Item1.xxx  m.Item2.xxx

  8. 使用xshell远程连接Linux

    Linux系统对于程序员来说并不陌生,对IT技术员来说是一个很好的开发平台,因此掌握Linux系统的操作对于一个程序员来说非常有用.而对于习惯使用windows的人来说直接在Linux系统下进行操作感 ...

  9. Java 实现 对象和转字符串之间的互转 (json格式)

    添加依赖: <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId> ...

  10. scroll-view组件

    <scroll-view></scroll-view> 组件 这个组件的属性:(是要不说属性值,写不写都可以(建议不写)) scroll-x:允许横向滚动 (如果你设这个属性就 ...