sparkSql表关联实际业务场景

该代码示例展示了如何在Scala中利用Spark处理数据表的join操作。首先,它接收命令行参数,包括表名、生成的表名、SQL语句和输出表名。接着,它读取数据,检查并修改有相同字段名的表,然后创建视图并执行SQL语句。最后,将结果存储到Hive中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
	语言:Scala
	业务场景:用Spark对表进行join,表连接
	思路:对表中相同字段名进行修改,再对表进行关联
*/

package test

import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}

import scala.collection.mutable
import scala.collection.mutable.Set

/**
  *实际业务表连接代码
  */
object TableJoin {
  def main(args: Array[String]): Unit = {
    //接收传入的参数
    //标志位
      val read_num=args(0)
    //传入的表名,之间用,分割
      val inputTable=args(1)
    //生成的表名,之间用,分割
      val tableName=args(2)
    //sparkSql语句
      val sql=args(3)
    //输出的表名
      val outputTableName=args(4)
    //保存hive,标识符
      val saveToHive=args(5)

    val tableArr: Array[String] = inputTable.split(",")
    val nameArr: Array[String] = tableName.split(",")
      val spark: SparkSession = getSpark
    if(tableArr.length!=nameArr.length){
      throw  new Exception("表个数和表个数不一致")
    }else if (tableArr.length<2 || nameArr.length<2){
      throw new Exception("至少输入两个表的路径和两张表名")
    }else{
      //把数据缓存在内存中
      val dataFrame1: DataFrame = spark.sql("select * from "+tableArr(0))
      val dataFrame2: DataFrame = spark.sql("select * from "+tableArr(1))
      //读取元数据信息
      val fataFrametype1: Array[(String, String)] = dataFrame1.dtypes
      val fataFrametype2: Array[(String, String)] = dataFrame1.dtypes
      //循环存取元数据信息
      val frameOneColumn=Set("")
      val frameTwoColumn=Set("")
      for (elem <- fataFrametype1) {
        frameOneColumn.add(elem._1)
      }
      for (elem <- fataFrametype2) {
        frameTwoColumn.add(elem._1)
      }
      //中间表
     var frameMiddle=dataFrame2
      //取相同字段
      val repeatColumn: mutable.Set[String] = frameOneColumn.intersect(frameTwoColumn)
      //修好第二个表中相同字段的字段名加_1
      for (elem <- repeatColumn) {
       frameMiddle=frameMiddle.withColumnRenamed(elem,elem+"_1")
      }
      //创建视图
      dataFrame1.createOrReplaceTempView(nameArr(0))
      frameMiddle.createOrReplaceTempView(nameArr(1))
    }
    //执行具体的sql语句
    val writeFrame: DataFrame = spark.sql(sql)
    //存储在hive里
    writeFrame.createOrReplaceTempView("temp_table1")
    spark.sql("drop table if exists"+outputTableName)
    spark.sql("create table " +outputTableName +" as select * from temp_table1")
    spark.sql("alter table "+outputTableName+" set serdeproperties('serialization.null.format'=''")
    spark.close()
  }
  //获取Spark环境

  def getSpark = {
    val sparkSession: SparkSession = SparkSession.builder()
      .master("local[*]")
      .appName("test")
      .config("spark.sql.crossJoin.enabled","true")
      .getOrCreate()
    sparkSession
  }
}
Spark DSL和Spark SQL是Spark中常用的两种编程接口,它们的优缺点和应用场景如下: 1. Spark DSL Spark DSL是Spark提供的一种编程接口,它是基于Spark RDD的强类型API。Spark DSL的主要优点是: - 可以在编译时检查类型错误,减少运行时异常; - 提供了强大的类型推断功能,可以帮助程序员更快地开发出正确的代码; - 支持函数式编程范式,提供了更加灵活的数据处理方式。 Spark DSL的主要缺点是: - 代码量较大,编写DSL代码需要花费较时间和精力; - DSL对于复杂的数据操作可能不够灵活,需要使用其他编程接口进行补充。 Spark DSL适用于需要对数据进行复杂处理、需要编写大量代码的场景,比如机器学习、图计算等。 2. Spark SQL Spark SQL是Spark提供的一种编程接口,它是基于DataFrame和DataSet的API。Spark SQL的主要优点是: - 可以使用SQL语言进行数据操作,对于熟悉SQL语言的人员更加友好; - 提供了优化的查询执行计划,可以更加高效地处理数据; - 可以和Hive、Parquet等数据源进行无缝集成。 Spark SQL的主要缺点是: - 由于使用了DataFrame和DataSet,所以不能处理非结构化数据; - 对于一些特殊需求(比如复杂的逻辑判断等),需要使用DSL或其他编程接口进行补充。 Spark SQL适用于对数据进行简单查询、统计、聚合等操作的场景,比如数据仓库、报系统等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值