自定义对象的mysql输出

本文详细介绍了在Hadoop中使用自定义对象进行序列化的过程,包括实现Serializable接口及DBWritable接口的方法,配置Job输出类型至数据库的具体步骤。

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

1、首先,自定义对象,该对象需要实现序列化功能才可以在网络上运行,实现序列化功能需要继承 java.io.Serializable 这个接口,
这个接口定义了空方法,不需要实现任何功能,表示具有序列化功能的一个空接口
不过需要定义一个序列号,例如如下:
 private static final long serialVersionUID = 1L;

    然而,hadoop中关于序列化对象的方法有一个需要实现readFields(ResultSet resultSet)和write(PreparedStatement preparedStatement)的
接口DBWritable,实现了该接口的对象方可在reducer和mapper中进行对象的存储。
例如:
    @Override
    public void write(PreparedStatement preparedStatement) throws SQLException {
        preparedStatement.setString(1, time);
        preparedStatement.setInt(2, sum);
        preparedStatement.setInt(3, workSum);
        preparedStatement.setDouble(4, rate);
    }

    @Override
    public void readFields(ResultSet resultSet) throws SQLException {
        resultSet.getString(1);
        resultSet.getInt(2);
        resultSet.getInt(3);
        resultSet.getDouble(4);
    }
2、定义输出类型为实现了序列化的类型
3、配置Job的输出类型
    先建立连接,配置数据库的驱动位置
                配置数据库的url位置
                配置数据库的账户和密码
        config.set(DBConfiguration.DRIVER_CLASS_PROPERTY,"com.mysql.jdbc.Driver");
        config.set(DBConfiguration.URL_PROPERTY,"jdbc:mysql://localhost:3306/test");
        config.set(DBConfiguration.USERNAME_PROPERTY, "root");
        config.set(DBConfiguration.PASSWORD_PROPERTY, "111111");
配置输出的数据表以及其中的内容,如下格式:    
        DBOutputFormat.setOutput(job_name, table_name, attribute_name1, attribute_name2, attribute_name3....);
        如下例子:
        DBOutputFormat.setOutput(job, "t_car", "time",  "sum", "work_sum", "rate");
    

### 如何在 MySQL 中创建和使用自定义对象 #### 创建存储过程 存储过程中可以包含复杂的逻辑,包括条件判断、循环以及 SQL 查询等。下面是一个简单的例子展示如何创建带 IN 和 OUT 参数的存储过程。 ```sql DROP PROCEDURE IF EXISTS testInOut; CREATE PROCEDURE testInOut(IN inId VARCHAR(64), OUT userName VARCHAR(64), OUT pwd VARCHAR(64)) BEGIN SELECT name, password INTO userName, pwd FROM test_user WHERE id = inId; END; ``` 调用此存储过程并获取其输出结果可以通过如下方式完成: ```sql CALL testInOut('d03e536d-f747-11ea-997c-00ff5f20e2ec', @name, @pwd); SELECT @name AS name, @pwd AS password; ``` 上述代码展示了带有输入输出参数的过程创建方法及其执行方式[^4]。 #### 定义触发器 触发器是在特定事件发生时自动激活的一段代码片段。例如,在某张表上插入新记录之前验证数据的有效性;当更新某些字段之后同步修改其他关联表格中的相应条目等操作都可以借助于触发器来实现自动化处理。 这里给出一个关于新增用户前检查邮箱格式的例子: ```sql DELIMITER // CREATE TRIGGER before_insert_user_email_validation BEFORE INSERT ON users FOR EACH ROW BEGIN DECLARE msg VARCHAR(255); IF NEW.email NOT LIKE '%_@__%.__%' THEN SET msg = CONCAT('Invalid email address: ', NEW.email); SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg; END IF; END// DELIMITER ; ``` 这段脚本会在尝试向 `users` 表中添加一条新的记录时先检验该用户的电子信箱地址是否符合标准模式[^1]。 #### 构建函数 (Function) 对于那些希望封装成单一功能单元的小型计算任务来说,编写函数可能是更好的选择。不同于存储过程的是,每一个函数都应当有一个明确的结果返回给调用者,并且不允许存在任何形式上的外部变量传递(即无IN/OUT参数)。以下是构建一个用于求两个整数最大公约数(GCD) 的简单实例: ```sql CREATE FUNCTION gcd(a INT, b INT) RETURNS INT DETERMINISTIC RETURN CASE WHEN a=b THEN a ELSE ( CASE WHEN a>b THEN GREATEST(gcd(b,a-b),gcd(a,b-a)) ELSE LEAST(gcd(b,a-b),gcd(a,b-a)) END ); ``` 请注意实际应用环境中应采用更高效的算法而非递归来提高性能效率[^2]。 #### 开发用户定义函数 (UDF) 如果现有的内建函数无法满足需求,则还可以考虑开发自己的 C/C++ 插件形式扩展 MySQL 功能集——这就是所谓的 "User Defined Functions"(简称 UDFs). 这种类型的函数允许开发者将自己的业务逻辑编译成本地库文件(.so),并通过注册到数据库系统内部从而能够在任何地方如同原生命令般被随意调用. 要使这些插件生效,除了正常的安装部署之外还需要确保它们已经被正确录入到了名为 `mysql.func` 的元数据表里边去以便后续加载使用[^3].
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值