spark程序将hive表亿条数据写入tidb

import java.sql.{Connection, DriverManager, PreparedStatement, SQLException}
import com.alibaba.fastjson.JSON
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.{IntegerType, LongType, StringType, StructField, StructType}
import org.apache.spark.sql.{DataFrame, SparkSession}
/**
 *  创建人:  xiaotao
 *  创建日期: Created on  2022/03/09
 *    数据开发功能描述:
 *     需求方: 158741600条数据
 *      只跑一次,后续数据由服务端做
 *
 *     数据流向:hiveToTidb
 *
 */
object TipsRurnPay2ToTidb {
  def main(args: Array[String]) {

    var part = ""

    val spark = SparkSession.builder
      .appName("TipsRurnPay2ToTidb")
      //.master("local[*]")
      .config("hive.exec.dynamic.partition", "true")
      .config("hive.exec.dynamic.partition.mode", "nonstrict")
      .config("hive.exec.max.dynamic.partitions", "10000")
      .config("hive.new.job.grouping.set.cardinality", "64")
      .config("spark.sql.crossJoin.enabled", "true")
      .config("spark.debug.maxToStringFields", "1024")
      .enableHiveSupport()
      .getOrCreate()

    //动态创建schema
    val schema = StructType(List(
      StructField("user_id", IntegerType, true),
      StructField("story_id", IntegerType, true),
      StructField("voice_type", IntegerType, true)
    ))


    for (i <- 0 until 10) {
      part = i.toString
      val TABLE_NAME = s"xx_story_user_listen_record${part}" -> "用户收听小知识记录"

      val FULL_SQL =
        s"""
           |select
           |       cast(user_id as int) as user_id
           |      ,story_id
           |      ,voice_type
           |from ads.ads_xx_tips_rurn_pay_user_listen_story_finish_a_d
           |where user_part = '${part}'
           |""".stripMargin
      println("待写入表名:" + TABLE_NAME._1 + ",待写入数据量", spark.sql(FULL_SQL).count())

      try {
        val df: DataFrame = spark.sql(FULL_SQL)
        df.toJSON
          .foreachPartition {
            tipsJsonItr => {
              var bean: tipsBean = null
              val conn = DriverManager.getConnection("jdbc:mysql://tidb.dev.xxx.com:4000/xx_content_assets", "root", "123456")
              conn.setAutoCommit(false) //不自动提交事务
              val sql = "REPLACE INTO xx_story_user_listen_record (user_id, story_id, voice_type) VALUES (?, ?, ?)"
              val pstat: PreparedStatement = conn.prepareStatement(sql)
              var i = 0

              tipsJsonItr.foreach(
                json => {
                  bean = JSON.parseObject(json, classOf[tipsBean]) // 转为javaBean
                  //dataList.add(Row(bean.user_id, bean.story_id, bean.voice_type))
                  pstat.setObject(1, bean.user_id)
                  pstat.setObject(2, bean.story_id)
                  pstat.setObject(3, bean.voice_type)
                  pstat.addBatch()

                  i = i + 1                  
                

       
                  if (i >= 1500) {
                    pstat.executeBatch()
                    conn.commit()

                    i = 0
                   // Thread.sleep(2000)

                  }
                }
              )

              if (i > 0 && i < 2000) {
                pstat.executeBatch()
                conn.commit()
              }
              conn.close()
            }
          }
        println(s"${TABLE_NAME._1}" + "  数据写入成功")

      }
      catch {
        case e: Exception => println(e)
      }

    }
  }
}

case class tipsBean(
                     user_id: Int,
                     story_id: Int,
                     voice_type: Int
                     )
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: 这个项目实战的目标是使用Java版本的SparkHive数据写入Elasticsearch。具体步骤如下: 1. 首先,需要在Spark中创建一个JavaSparkContext对象,并且设置相关的配置,比如Elasticsearch的地址和端口号等。 2. 接下来,需要使用HiveContext对象来读取Hive数据。可以使用HiveContext的sql方法来执行Hive SQL语句,或者使用HiveContext的table方法来读取Hive数据。 3. 读取Hive数据后,需要将数据转换成Elasticsearch的格式。可以使用JavaRDD的map方法来实现数据的转换。 4. 转换完成后,需要将数据写入Elasticsearch。可以使用JavaRDD的foreachPartition方法来实现数据的批量写入。 5. 最后,记得关闭JavaSparkContext对象。 以上就是使用Java版本的SparkHive数据写入Elasticsearch的步骤。需要注意的是,具体实现过程中还需要考虑一些细节问题,比如数据类型的转换、数据的去重等。 ### 回答2: 在实现SparkHive数据写入Elasticsearch的过程中,首先需要搭建好相关的环境,包括Hadoop、Hive和Elasticsearch等。然后,根据Spark的API接口,可以编写相关的Java代码来实现将Hive数据写入Elasticsearch的操作。 具体实现步骤如下: 1. 导入相关依赖:在Maven项目中,需要添加以下依赖: ```xml <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_${scalaVersion}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_${scalaVersion}</artifactId> <version>${spark.version}</version> </dependency> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch-spark-20_2.11</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>${hive.version}</version> </dependency> ``` 其中,${scalaVersion}、${spark.version}、${elasticsearch.version}和${hive.version}需要根据实际情况进行替换。 2. 初始化SparkConf和SparkSession对象:在Java代码中,需要先初始化SparkConf和SparkSession对象: ```java SparkConf conf = new SparkConf().setAppName("Spark-Hive-Elasticsearch"); SparkSession spark = SparkSession.builder().config(conf).enableHiveSupport().getOrCreate(); ``` 其中,setAppName用于设置Spark应用程序的名称,getOrCreate用于获取一个已有的Spark或创建一个新的Spark。 3. 读取Hive数据:可以使用SparkSession的read方法读取Hive数据,如下所示: ```java DataFrame df = spark.read().table("mytable"); ``` 其中,mytable为Hive的名称。 4. 配置Elasticsearch索引:在将Hive数据写入Elasticsearch时,需要配置相关的索引,如下所示: ```java Map<String, String> esConfig = new HashMap<>(); esConfig.put("es.nodes", "localhost"); esConfig.put("es.port", "9200"); esConfig.put("es.resource", "myindex/mytype"); ``` 其中,es.nodes和es.port用于配置Elasticsearch的地址和端口,es.resource用于指定Elasticsearch的索引名称和类型名称。 5. 将Hive数据写入Elasticsearch:可以使用DataFrame的write方法将Hive数据写入Elasticsearch,如下所示: ```java df.write().format("org.elasticsearch.spark.sql").mode(SaveMode.Append).options(esConfig).save(); ``` 其中,format指定了保存的格式为Elasticsearch格式,mode指定了保存的模式为Append,options指定了保存的配置项。 通过上述步骤,即可实现SparkHive数据写入Elasticsearch的操作。当然,在实际应用过程中,还需要根据具体需求进行相关的优化和调整。 ### 回答3: 这个项目实战的主要目的是将Hive数据写入到Elasticsearch。Hive是Hadoop中的数据仓库,而Elasticsearch则是一个高性能的搜索和分析引擎。将这两个系统结合起来可以实现更好的数据分析和可视化。 在开始实现之前,需要先搭建好Hadoop和Elasticsearch环境,并且熟悉Java编程语言和Spark框架。接下来,可以按照以下步骤进行实现。 第一步:配置Maven项目并添加Spark和Elasticsearch的依赖库。在pom.xml文件中添加以下代码: ``` <!-- Spark --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.4.5</version> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.4.5</version> </dependency> <!-- Elasticsearch --> <dependency> <groupId>org.elasticsearch</groupId> <artifactId>elasticsearch-spark-20_2.11</artifactId> <version>7.6.2</version> </dependency> ``` 第二步:编写代码读取Hive数据。使用Spark SQL读取Hive数据并将其转换为DataFrame,例如: ``` String tableName = "hive_table_name"; Dataset<Row> df = sparkSession.table(tableName); ``` 第三步:将DataFrame中的数据写入Elasticsearch。使用Elasticsearch Spark库提供的API来将数据写入Elasticsearch,例如: ``` // 配置Elasticsearch参数 Map<String, String> esConfigs = new HashMap<>(); esConfigs.put("es.nodes", "localhost"); esConfigs.put("es.port", "9200"); esConfigs.put("es.mapping.id", "id"); // 写入数据 df.write().format("org.elasticsearch.spark.sql") .options(esConfigs).mode("overwrite") .save("index_name/document_type"); ``` 最后一步:运行代码并验证数据是否已经成功写入Elasticsearch。可以使用Kibana界面进行数据可视化展示和分析。 通过以上步骤,就可以成功实现将Hive数据写入Elasticsearch的功能。这个项目实战可以帮助开发人员更好地理解和应用Spark和Elasticsearch技术,并且提升数据分析和可视化的能力。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值