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代码


posted @ 2022-07-17 22:33  a-tao必须奥利给  阅读(55)  评论(0)    收藏  举报