一、使用java语言编写
步骤:
1、加载运行环境
2、加载数据(从本地加载或链接数据库)
3、处理数据或创建临时视图(视情况而定是否需要)
4、写SQL或自定义UDF函数或使用DSL
5、查询、显示
6、关闭
完整代码:
public class JavaSql03_local extends UDF {
public static void main(String[] args) {
//TODO 运行环境
SparkSession sparkSession = SparkSession.builder().appName("JavaSql03_local").master("local[*]").getOrCreate();
sparkSession.sparkContext().setLogLevel("WARN");
//TODO 加载数据
//从jdbc加载数据
//方法一
/*Dataset<Row> ds1 = sparkSession.read().format("jdbc")
.option("url", "jdbc:mysql://localhost:3306/mydb")
.option("driver","com.mysql.jdbc.Driver")
.option("user", "root")
.option("password", "123456")
.option("dbtable", "person")
.load();
ds1.printSchema(); //输出字段类型
ds1.show();*/
//方法二
Properties properties = new Properties();
properties.put("user","root");
properties.put("password","123456");
Dataset<Row> ds2 = sparkSession.read()
.jdbc("jdbc:mysql://localhost:3306/mydb", "person", properties);
ds2.printSchema(); //输出字段类型
ds2.show();
//TODO 处理数据
//创建视图
//ds1.createOrReplaceTempView("tableName1");
ds2.createOrReplaceTempView("person");
//TODO 自定义UDF函数
// sparkSession.udf().register("udfName",(String value)=>{
// value.toUpperClass();
// })
//TODO ================SQL================================
String sql = "SELECT " +
" name," +
" (age + 1) as nianl" +
" FROM" +
" `person`";
sparkSession.sql(sql).show();
sparkSession.sql(sql).createOrReplaceTempView("table1");
int age = 12;
//传递参数
sparkSession.sql("select name,nianl from table1 where nianl = '"+age+"'").show();
//sparkSession.sql("select name,nianl from person where nianl = '${age}'").show();
/**
* +---+----+---+
* | id|NAME|age|
* +---+----+---+
* | 1| zs| 11|
* | 2| ls| 22|
* | 3| ww| 33|
* +---+----+---+
* */
//TODO ================DSL================================
System.out.println("=========DSL=========");
ds2.select(col("age").plus(1)).show();
// ds2.groupBy("name")
// .count()
// .orderBy(col("age").desc()) //使用col()需要引入包 import static org.apache.spark.sql.functions.col;
// //.write()
// //.mode(SaveMode.Overwrite)
// //.jdbc()
// .filter("") //过滤 相当于where
// .agg(avg("age"),max("age"))//分类聚合函数,常与groupby连用
// .show();
// ;
// //方法二
// ds1.write().format("jdbc")
// .option("url","jdbc:mysql//....")
// .option("user","root")
// .option("password","123")
// .option("dbtable","t_table")
// .mode(SaveMode.Append)
// .save();
//TODO 关闭
sparkSession.stop();
}
}
二、使用scala语言编写
scala是spark的主要编程语言,相较于java更简洁
上代码:
package spark.sql
import org.apache.spark.SparkContext
import org.apache.spark.sql.{DataFrame, DataFrameReader, Dataset, SaveMode, SparkSession}
import java.util.Properties
/**
* 操作外部数据源
* 支持多种文件格式、文件系统、数据库
* 读:sparkSession.read.格式(text、json、jdbc)
* 写:dataframe .write.格式(text、json、jdbc)
* */
object SparkSql04_DataSource {
def main(args: Array[String]): Unit = {
//TODO 0、运行环境
val sparkSession = SparkSession.builder().master("local[*]").getOrCreate()
val sc: SparkContext = sparkSession.sparkContext
sc.setLogLevel("WARN")
import sparkSession.implicits._
//TODO 1、加载数据
val df: DataFrame = sparkSession.read.json("data/input/test.json")
//sparkSession.read.jdbc("","","") //读取数据库内容
df.show()
val df1: DataFrame = sparkSession.read.format("jdbc")
.option("url", "jdbc:mysql://localhost:3306/bootdo")
.option("driver", "com.mysql.jdbc.Driver")
.option("user", "root")
.option("password", "123456")
.option("dbtable", "promptInfo").load()
df1.show()
//TODO 2、处理数据
val pop = new Properties()
pop.setProperty("user","root")
pop.setProperty("password","123456")
df.coalesce(1) //指定分区数
.write.mode(SaveMode.Overwrite) //如果表存在则覆盖
.jdbc("jdbc:mysql://localhost:3306/bootdo?characterEncoding=utf8","person",pop)
val sqlStr: String =
"""
|select value,count(*) as cNum
|from t_words
|group by value
|order by value
|""".stripMargin
//stripMargin用来对齐每行字符串,每行用 | 开头
sparkSession.sql(sqlStr).show()
val ds: Dataset[String] = sparkSession.read.textFile("data/input/words.txt")
//TODO 2、处理数据
val words: Dataset[String] = ds.flatMap(_.split(" "))
words.show()
//TODO 创建表名
words.createOrReplaceTempView("t_words")
//TODO ==================DSL========================
words.groupBy("value")
.count()
.orderBy('count.desc)
.show()
//TODO 关闭
sparkSession.stop()
}
case class Person(id:Int,name:String,age:Int)
}