栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

SparkSQL抽取Mysql全量数据到Hive动态分区表中

SparkSQL抽取Mysql全量数据到Hive动态分区表中

部分概念内容:hive学习(七)------创建动态分区_BigDate_小学生的博客-CSDN博客

前言:我这里把hive-site.xml文件放在了resource目录中,相关配置及依赖在后面。

package my_project

import org.apache.spark.sql.SparkSession

object my_work02 {
  def main(args: Array[String]): Unit = {

    //TODO 动态分区表demo

    val spark: SparkSession = SparkSession
      .builder()
      .appName("my_work01")
      .master("local[*]")
      .enableHiveSupport()
      .getOrCreate()

    //读取MySQL数据,创建临时表
    spark.read
      .format("jdbc")
      .option("driver", "com.mysql.jdbc.Driver")
      .option("url", "jdbc:mysql://localhost:3306/spark_db")
      .option("user", "root")
      .option("password", "456789")
      .option("dbtable", "movies")
      .load()
      .createOrReplaceTempView("datas")

    // TODO 以下两个参数必须要在建表前使用
    //(开启动态分区,默认为true)
    spark
      .sql(
        """
        |set hive.exec.dynamic.partition=true
        |""".stripMargin
      )

    //(动态分区模式,默认为strict——必须有一列为静态分区,所以这里改成 nonstrict)
    spark
      .sql(
        """
                |set hive.exec.dynamic.partition.mode=nonstrict
                |""".stripMargin
      )

//    其余优化参数配置:
//    set hive.exec.max.dynamic.partitions.pernode=100 (默认100)
//    表示每个maper或reducer可以允许创建的最大动态分区个数,默认是100,超出则会报错。

//    set hive.exec.max.dynamic.partitions =1000(默认值) 最大动态分区个数,超出报错
//
//    set hive.exec.max.created.files =10000(默认) 全局可以创建的最大文件个数,超出报错。

    //创建动态分区表
    spark.sql(
      """
        |CREATE TABLE  mydb.dynamic_movies(
        |   movie_name  string,
        |   boxoffice  string,
        |   box_rate  string,
        |   sessions  string,
        |   show_count_rate  string,
        |   avg_number string,
        |   attendance string,
        |   total_boxoffice string,
        |   movie_days string,
        |   current_time string,
        |   releasedate string
        |)partitioned by (time string) 
        |row format delimited fields terminated by 't'
        |""".stripMargin
    )
    //我这里是以current_time这个字段来分区的,只不过改了个名字time,取名无所谓的,但要见名之意

    //将MySQL中读取出来的全量数据以日期为分区字段同步到hive表中(动态分区)
    spark
      .sql(
        """
        |insert into table mydb.dynamic_movies partition(time)
        |select movie_name,boxoffice,box_rate,sessions,show_count_rate,avg_number,
        |attendance,total_boxoffice,movie_days,current_time,releasedate,current_time
        |from 
        |   datas 
        |order by total_boxoffice desc
        |""".stripMargin
      )

    // TODO 我这里的select语句查出来比上头动态分区表的字段多一列,按理说这会报错啊!
    //  是因为动态分区表会自动将select的最后一个字段映射为我们的分区字段,也就是说,最后一个字段就是我们的分区字段
    //  这点十分重要!!!

    spark.stop()

  }
}

依赖配置



    4.0.0
    self
    spark-practice
    1.0-SNAPSHOT
    
        2.1.0
        2.11
    
    
        
            nexus-aliyun
            Nexus aliyun
            http://maven.aliyun.com/nexus/content/groups/public
        
    
    

        
            org.apache.spark
            spark-core_${scala.version}
            ${spark.version}
        
        
            org.apache.spark
            spark-streaming_${scala.version}
            ${spark.version}
        
        
            org.apache.spark
            spark-sql_${scala.version}
            ${spark.version}
        
        
            org.apache.spark
            spark-hive_${scala.version}
            ${spark.version}
        
        
            org.apache.spark
            spark-mllib_${scala.version}
            ${spark.version}
        

        
            mysql
            mysql-connector-java
            5.1.27
        


        
            org.slf4j
            slf4j-log4j12
            2.0.0-alpha0
            compile
        

        
            org.slf4j
            slf4j-api
            2.0.0-alpha0
        


        
            log4j
            log4j
            1.2.17
        

        
            org.slf4j
            slf4j-nop
            1.7.25
            compile
        


    

hive-site.xml配置文件 






javax.jdo.option.ConnectionURL
jdbc:mysql://hadoop106:3306/metastore?useSSL=false




javax.jdo.option.ConnectionDriverName
com.mysql.jdbc.Driver




javax.jdo.option.ConnectionUserName
root




javax.jdo.option.ConnectionPassword
000000




hive.metastore.schema.verification
false




hive.metastore.event.db.notification.api.auth
false




hive.metastore.warehouse.dir
/user/hive/warehouse




hive.metastore.uris
thrift://hadoop106:9083




hive.server2.thrift.bind.host
hadoop106




hive.server2.thrift.port
10000



hive.cli.print.header
true



hive.cli.print.current.db
true






转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/650813.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号