JAVA拉取Hive的数据导入到MySQL中

在这里插入图片描述

1.pom文件需要的依赖

    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.38</version>
    </dependency>
   <!-- https://mvnrepository.com/artifact/org.apache.spark/spark-hive -->
    <dependency>
      <groupId>org.apache.spark</groupId>
      <artifactId>spark-hive_2.11</artifactId>
      <version>2.4.4</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.6</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.10</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-jdbc -->
    <dependency>
      <groupId>org.apache.hive</groupId>
      <artifactId>hive-jdbc</artifactId>
      <version>1.1.0</version>
    </dependency>

2.xml文件配置
mybatis-xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC
        "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <typeAlias type="org.example.DruidDataSourceFactory" alias="DRUID"></typeAlias>
        <typeAlias type="org.entry.Events" alias="event"></typeAlias>
    </typeAliases>
    <environments default="zjy">
        <environment id="zjy">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="DRUID">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.181.132:3306/ms_dm_intes"/>
                <property name="username" value=
你问的是:**“通过 Hive 进行连接到 MySQL”**,这通常是指: > 如何使用 **Hive** 与 **MySQL** 进行数据交互? > 比如:从 MySQL数据(作为维度表)到 Hive,或将 Hive 处理后的结果写入 MySQL。 虽然 Hive 本身不能“直接运行 MySQL 的 SQL”,但我们可以通过 **Hive 的 JDBC Storage Handler** 或 **Sqoop** 实现 HiveMySQL 的双向连接。 下面我将详细介绍两种主流方式,并给出完整示例代码。 --- ## ✅ 方式一:使用 Hive + JDBC StorageHandler(Hive 2.x+) 这种方式可以让 Hive 表映射到 MySQL 表,实现“外部表”访问 MySQL 数据。 ### 📌 场景 - Hive 查询时实时从 MySQL数据(适用于小量维度表) - 不适合大批量写入或频繁操作 --- ### 步骤 1:准备环境 #### 1. 安装 Hive 的 JDBC 支持 确保以下 JAR 包在 Hive 的 classpath 中: ```bash # 下载 MySQL JDBC 驱动 wget https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.33/mysql-connector-java-8.0.33.jar # 将其复制到 Hive lib 目录 cp mysql-connector-java-8.0.33.jar $HIVE_HOME/lib/ ``` #### 2. 启用 Hive 的 JDBC 功能 在 `hive-site.xml` 中配置: ```xml <property> <name>hive.execution.engine</name> <value>tez</value> <!-- 或 mr --> </property> <!-- 启用非本地模式下的 JDBC 支持 --> <property> <name>hive.security.authorization.enabled</name> <value>false</value> </property> ``` --- ### 步骤 2:创建 Hive 外部表映射 MySQL 表 假设你的 MySQL 中有一个表: ```sql -- MySQL 中的 dim_brand 维度表 CREATE TABLE dim_brand ( brand_id INT PRIMARY KEY, brand_name VARCHAR(50), category VARCHAR(30) ); INSERT INTO dim_brand VALUES (1, '雅诗兰黛', '护肤'), (2, '海蓝之谜', '高端护肤'); ``` 现在在 Hive 中创建一个外部表来映射它: ```sql CREATE DATABASE mini_dw_beauty; USE mini_dw_beauty; -- 创建 JDBC 映射表 CREATE EXTERNAL TABLE ods_dim_brand_jdbc ( brand_id INT, brand_name STRING, category STRING ) STORED BY 'org.apache.hive.storage.jdbc.JdbcStorageHandler' TBLPROPERTIES ( "hive.sql.database.type" = "MYSQL", "hive.sql.jdbc.url" = "jdbc:mysql://localhost:3306/testdb", "hive.sql.jdbc.driver" = "com.mysql.cj.jdbc.Driver", "hive.sql.table.name" = "dim_brand", "hive.sql.username" = "root", "hive.sql.password" = "your_password" ); ``` > 🔍 参说明: > - `jdbc:mysql://localhost:3306/testdb`:替换为你的数据库地址 > - `testdb`:MySQL 数据库名 > - 用户名密码请根据实际情况填写 --- ### 步骤 3:查询 MySQL 数据 ```sql -- 查看是否能查到 MySQL 中的数据 SELECT * FROM ods_dim_brand_jdbc; ``` 输出应为: ``` 1 雅诗兰黛 护肤 2 海蓝之谜 高端护肤 ``` ✅ 成功!Hive 已经可以“透明地”访问 MySQL 数据。 --- ### ⚠️ 注意事项 - **性能差**:每次查询都会走网络请求,不适合大表。 - **只读为主**:JDBC StorageHandler 对写支持有限。 - **推荐用途**:仅用于同步维度表(如品牌、用户画像等小表) --- ## ✅ 方式二:使用 Sqoop(推荐用于大批量导入导出) 如果你要批量迁移数据(比如把 Hive 结果写回 MySQL),应该用 **Sqoop**。 ### 示例:将 Hive 表导出到 MySQL 假设你已经处理完 `dwd_beauty_order` 表,想导出销售汇总结果到 MySQL 报表表中。 #### 1. 在 MySQL 创建目标表 ```sql CREATE TABLE ads_province_stats ( stat_date DATE, province VARCHAR(20), order_cnt BIGINT, total_amount DOUBLE, avg_amount DOUBLE, user_cnt BIGINT, province_rank INT ); ``` #### 2. 使用 Sqoop 导出 Hive 数据MySQL ```bash sqoop export \ --connect jdbc:mysql://localhost:3306/testdb \ --username root \ --password your_password \ --table ads_province_stats \ --export-dir /user/hive/warehouse/mini_dw_beauty.db/dws_province_day/dt=2025-10-11 \ --input-fields-terminated-by '\001' \ --num-mappers 1 ``` > 🔹 `--export-dir`:Hive 表对应 HDFS 路径(TEXTFILE 格式默认分隔符是 `\001`) > 🔹 若字段分隔符不同,请调整 --- ### 替代方案:先导出为文本,再加载 如果 Sqoop 不可用,也可以: ```sql -- Step 1: 将 Hive 结果导出为 CSV INSERT OVERWRITE DIRECTORY '/tmp/ads_province_csv' ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' SELECT order_date, province, order_cnt, total_amount, avg_amount, user_cnt, ROW_NUMBER() OVER (ORDER BY total_amount DESC) FROM dws_province_day WHERE dt = '2025-10-11'; ``` 然后用 Shell + MySQL 命令导入: ```bash hdfs dfs -cat /tmp/ads_province_csv/* > /tmp/province_stats.csv mysql -u root -p testdb << EOF LOAD DATA LOCAL INFILE '/tmp/province_stats.csv' INTO TABLE ads_province_stats FIELDS TERMINATED BY ','; EOF ``` --- ## ✅ 总结对比 | 特性 | Hive JDBC External Table | Sqoop | 直接导出 + LOAD DATA | |------|--------------------------|-------|------------------------| | 实时性 | 高(实时查) | 批量 | 批量 | | 性能 | 差(小表专用) | 好 | 好 | | 写入支持 | 有限 | 强 | 强 | | 使用场景 | 维度表 | ETL 输出报表 | 快速导出测试 | | 是否需要额外工具 | 是(驱动包) | 是(Sqoop) | 否 | --- ## ✅ 典型架构应用 ``` [MySQL 维度表] ↓ (JDBC External Table) [Hive ODS → DWD → DWS 层处理] ↓ (Sqoop Export) [MySQL ADS 应用层报表] ``` 这是典型的仓架构:**MySQL 提供维度和结果展示,Hive 负责中间大规模计算。** ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值