spark submit_UDF_JDBC
spark
将项目打包到集群中运行
package com.sql
import org.apache.spark.sql.{DataFrame, SaveMode, SparkSession}
object Demo9Submit {
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession
.builder()
//提交到集群运行需要注释
// .master("local")
.appName("submit")
.getOrCreate()
import spark.implicits._
import org.apache.spark.sql.functions._
//读取hdfs中的数据
val studentDF: DataFrame = spark
.read
.format("csv")
.option("sep", ",")
.schema("id STRING,name STRING,age INT,gender STRING,clazz STRING")
.load("/spark/data/students")
val genderNumDF: DataFrame = studentDF
.groupBy($"gender")
.agg(count($"gender") as "c")
//保存数据到hdfs
genderNumDF
.write
.format("csv")
.option("sep", ",")
.mode(SaveMode.Overwrite)
.save("/spark/target/gender_num")
}
}
spark 的自定义函数UDF
package com.shujia.spark.sql
import org.apache.spark.sql.expressions.UserDefinedFunction
import org.apache.spark.sql.{DataFrame, SparkSession}
object Demo13UDF {
def main(args: Array[String]): Unit = {
val spark: SparkSession = SparkSession
.builder()
.master("local")
.appName("Demo13UDF")
.config("spark.sql.shuffle.partitions", 1)
.getOrCreate()
import spark.implicits._
import org.apache.spark.sql.functions._
/**
* 1、DSL自定义函数
* 在自定义函数中可以编写scala代码
*
*/
val str_len: UserDefinedFunction = udf((str: String) => {
str.length
})
val studentDF: DataFrame = spark
.read
.format("json")
.load("data/students.json")
//使用自定义函数
studentDF
.select(str_len($"clazz"))
.show()
/**
* 2、SQL 自定义函数
*
*/
//在sql中使用自定义函数需要注册
spark.udf.register("str_len", str_len)
studentDF.createOrReplaceTempView("student")
spark
.sql(
"""
|select str_len(clazz) from student
|
|""".stripMargin)
.show()
/**
* 3、在Spark-sql命令行中使用hive的自定义函数
* 1、写一个hive的自定义函数
* 2、将类打包上传到spark 的jars目录下 /usr/local/soft/spark-2.4.5/jars
* 3、进入到spark-sql的命令行创建一个自定义函数
* create function str_len as 'com.shujia.spark.sql.Demo14StrLeb';
*
*/
}
}
spark JDBC
package com.shujia.spark.sql
import java.sql.{Connection, DriverManager, PreparedStatement, ResultSet}
object DEmo15SParkJDBC {
def main(args: Array[String]): Unit = {
/**
* 使用jdbc链接spark sql jdbc服务
*
*/
//1、加载驱动
Class.forName("org.apache.hive.jdbc.HiveDriver")
//2、创建jdbc李连杰
val con: Connection = DriverManager.getConnection("jdbc:hive2://master:10000/default")
//3、写sql查询数据
val stat: PreparedStatement = con.prepareStatement("select clazz,count(1) as c from student group by clazz")
//4、执行查询
val resultSet: ResultSet = stat.executeQuery()
//5、解析数据
while (resultSet.next()) {
val clazz: String = resultSet.getString("clazz")
val c: Long = resultSet.getLong("c")
println(s"$clazz\t$c")
}
//关闭链接
stat.close()
con.close()
}
}
Spark JDBC
1、开启hive的元数据服务
nohup hive --service metastore >> metastore.log 2>&1 &
2、开启spark jdbc 服务
saprkjdbc服务使用的就是hive的jdbc服务
cd /usr/local/soft/spark-2.4.5/sbin/
./start-thriftserver.sh --master yarn-client
3、使用命令链接spark sql jdbc服务
cd /usr/local/soft/spark-2.4.5/bin/
./beeline
输入
!connect jdbc:hive2://master:10000
设置sparkshuffle并行度
set spark.sql.shuffle.partitions=2;
4、使用scala代码远程链接spark sql jdbc服务
-- 1、在maven增加增加jdbc驱动
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>1.2.1</version>
</dependency>
-- 2、编写java jdbc代码

浙公网安备 33010602011771号