spark写入mysql和hive的方式

此代码示例展示了如何使用SparkSession连接MySQL数据库并读取数据,提供了三种不同的连接方式,并演示了将数据写入Hive表的操作,包括静态和动态分区。此外,还配置了Hive的元数据URI和存储路径。
摘要由CSDN通过智能技术生成

写入mysql和hive的方式

package com.ithhs.spark

import java.util.Properties

import org.apache.spark.sql.functions.{coalesce, from_unixtime, to_date, unix_timestamp}
import org.apache.spark.sql.{Column, DataFrame, SaveMode, SparkSession}

object JdbcDemo {

  def main(args: Array[String]): Unit = {
    //创建执行环境
    val spark: SparkSession = SparkSession.builder()
      //hive元数据
      .config("hive.metastore.uris", "thrift://192.168.80.81:9083")
      //hive存储路径
      .config("spark.sql.warehouse.dir", "hdfs://192.168.80.81:9000/user/hive/warehouse")
      //执行本地
      .master("local")
      //名称
      .appName("data")
      //必须加enableHiveSupport(),这样才可以往hive数据表写数据
      .enableHiveSupport()
      .getOrCreate()

    // 连接mysql方式1 建议使用该方式
    val properties = new Properties()
    properties.put("user", "root") //用户名
    properties.put("password", "password") // 密码
    val jdbc_url = "jdbc:mysql://192.168.80.81:3306/test?useUnicode=true&characterEncoding=utf-8"//连接数据库

    val df1: DataFrame = spark.read.jdbc(jdbc_url, "(select * from test) tmp", properties) //jdbc

    //连接mysql方式2 不建议使用
    val df2: DataFrame = spark.read.format("jdbc")
      .option("url", "jdbc:mysql://192.168.80.81:3306/test?useUnicode=true&characterEncoding=utf-8")//连接数据库
      //.option("dbtable", "(select a.*,b.cid,b.cname from province a left join city b on a.pid=b.pid) tmp")
      .option("dbtable", "(select * from tmail) tmp")//sql语句,也可以是表名
      .option("user", "root")//用户
      .option("password", "password")//密码
      .load()
      df2.show()

    //连接mysql方式3
    val mapJdbc = Map(
      "url" -> "jdbc:mysql://192.168.80.81:3306/test?useUnicode=true&characterEncoding=utf-8", //连接数据库
      "user" -> "root", //用户
      "password" -> "password", //密码
      "dbtable" -> "(select * from user)as a" //按要求写sql语句
    )  
    //读取mysql数据
    val df3: DataFrame = spark.read.format("jdbc")
      .options(mapJdbc).load()
      df3.show()

    //写入hive数据库的操作,Overwrite覆盖 Append追加,ErrorIfExists存在保报错,Ignore:如果存在就忽略
    df3.write.mode(SaveMode.Append).format("hive").saveAsTable("web.users")//
    //动态分区
    //因为要做动态分区, 所以要先设定partition参数
    //由于default是false, 需要额外下指令打开这个开关
    spark sql ("set hive.exec.dynamic.partition=true")
    spark sql ("set hive.exec.dynamic.partition.mode=nostrick")
    //指定分区字段到分区表中
    df3.write.mode(SaveMode.Append).format("hive").partitionBy("bt").saveAsTable("gdcmxy.users")
  }
}
### 回答1: 在Spark读取MySQL并将数据写入Hive,您可以按照以下步骤进行操作: 1. 在Spark创建一个JDBC连接,用于连接MySQL数据库。您需要指定MySQL数据库的连接URL、用户名和密码等信息。 2. 通过SparkJDBC连接,读取MySQL数据库的数据,并将其转换为Spark的DataFrame格式。 3. 将DataFrame的数据写入Hive。您可以使用Spark SQL的“saveAsTable”函数,将DataFrame数据保存为Hive表。 具体的代码实现可以参考下面的示例: ```scala import org.apache.spark.sql.SparkSession object MySQLToHiveExample { def main(args: Array[String]) { val spark = SparkSession .builder() .appName("MySQLToHiveExample") .enableHiveSupport() .getOrCreate() val jdbcUrl = "jdbc:mysql://localhost:3306/mydb" val jdbcUsername = "myusername" val jdbcPassword = "mypassword" val jdbcTable = "mytable" val mysqlDF = spark.read.format("jdbc") .option("url", jdbcUrl) .option("dbtable", jdbcTable) .option("user", jdbcUsername) .option("password", jdbcPassword) .load() mysqlDF.write.mode("overwrite").saveAsTable("hive_table") } } ``` 在这个例子,我们创建了一个SparkSession对象,并启用了Hive支持。我们使用SparkJDBC连接读取MySQL数据库的数据,并将其保存到一个名为“hive_table”的Hive。注意,我们使用“overwrite”模式,这意味着如果表已经存在,则会先删除表,然后重新创建。 ### 回答2: Apache Spark是一个快速、易于使用的开源分布式计算系统,具有支持SQL查询和大规模数据处理能力。而MySQL是一种流行的关系型数据库管理系统,广泛应用于企业和个人工作领域。在处理大规模数据时,Spark能够通过读取MySQL数据来支持高效的数据处理。本文将介绍如何将Spark读取MySQL数据,并将结果写入Hive。 1. 安装和设置SparkHive 首先,需要安装Hadoop和Hive,并在Spark的classpath添加Hive和Hadoop依赖项。SparkHive的集成需要进行一些设置,需要在Spark配置访问Hive元数据存储的地址。 spark.sql.warehouse.dir=hdfs://localhost:9000/user/hive/warehouse spark.sql.catalogImplementation=hive 以上是Spark的配置文件内容,在该文件添加上述内容后保持保存即可。 2. 加载MySQL数据 通过Spark JDBC连接器可以加载MySQL数据,只需要使用Spark JDBC驱动程序并指定连接URL。在接下来的代码,我们定义一个名为“jdbcDF”的DataFrame,它将存储MySQL“customers”表的数据。 val url = "jdbc:mysql://xxxx:yyyy/customers?user=???&password=???" val jdbcDF = spark.read .format("jdbc") .option("url", url) .option("dbtable", "customers") .load() 其,“url”参数定义了MySQL数据库名称、“user”和“password”是数据库登录凭证,而“dbtable”选项则指定要加载的MySQL表的名称。 3. 将数据写入Hive 数据加载到DataFrame之后,可以使用Spark SQL或DataFrame API将数据写入Hive。使用Spark SQL进行数据写入操作如下所示: jdbcDF.write .format("hive") .mode("append") .saveAsTable("customer_data") 其,“format”参数指定要保留到哪个数据源,这里是“hive”,然后“mode”参数是指在进行数据写入时发生冲突时应该采取的处理方式,这里指定为“append”。最后,使用“saveAsTable”来指定将数据保存到哪个Hive。 此外,还可以使用DataFrame API进行数据写入。以下是代码示例: jdbcDF.write.mode(SaveMode.Append).insertInto("customer_data") 其,“SaveMode.Append”表示在写入数据时插入新行,以保留当前数据。另外,通过“insertInto”方法,将数据插入到Hive。 综上所述,Spark用于读取MySQL并将结果写入Hive的过程如上所述。通过这个过程,可以实现高效处理大规模数据的效果。 ### 回答3: Spark是一种强大的分布式计算框架,可以处理超大数据集。对于存储在MySQL的数据,它可以使用JDBC连接器读取数据。而对于Hive,它可以将处理过的数据写入Hive表。 在使用Spark进行MySQL数据读取时,需要先下载和安装JDBC连接器,并在Spark应用程序添加以下配置: ``` val jdbcHostname = "localhost" val jdbcPort = 3306 val jdbcDatabase = "yourDatabase" val jdbcUsername = "yourUsername" val jdbcPassword = "yourPassword" val jdbcUrl = s"jdbc:mysql://${jdbcHostname}:${jdbcPort}/${jdbcDatabase}?user=${jdbcUsername}&password=${jdbcPassword}" val connectionProperties = new java.util.Properties() connectionProperties.setProperty("Driver", "com.mysql.jdbc.Driver") ``` 以上配置,将localhost、3306、yourDatabase、yourUsername以及yourPassword修改为自己MySQL数据库的相关信息。 在Spark应用程序,可以使用SparkSession对象和JDBC连接器来读取MySQL的数据,并将数据存储在DataFrames,如下所示: ``` val df = spark.read.jdbc(jdbcUrl, "yourTable", connectionProperties) ``` 以上代码,将yourTable修改为您想要读取的表名。 接下来,可以使用Spark对数据进行处理,spark.sql()方法提供了直接执行SQL语句的方法。 最后,可以将处理后的数据写入Hive。在保存DataFrame时,可以使用Spark的saveAsTable()方法。该方法将DataFrame转换为Hive表,并将其保存到Hive元数据库。 ``` df.write.mode(SaveMode.Overwrite).saveAsTable("yourHiveTable") ``` 以上代码,将yourHiveTable修改为您要写入Hive表的名称。 总之,使用Spark读取MySQL数据并将其写入Hive表是非常简单直接的。只需要下载并安装正确的JDBC连接器,然后按照上述步骤进行代码编写即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值