使用JDBC获取select count(*) from table_name

public int getCount() {
int count = 0;
PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = "select count(*) from table_name";
        try {
         con=this.getConnection();
         if (con!=null) {
ps=con.prepareStatement(sql);
rs=ps.executeQuery();
if(rs.next()) {
count=rs.getInt(1);
System.out.println("count:"+count);
}
}
        } catch (Exception e) {

// TODO: handle exception
}
     return count;
}
--------------------- 

还可以这样:
select count(1) as numb from ...

rs.getInt("numb");

 

是这样子的
select count(*) from [table]

rs.next();
int count =rs.getInt(1);
就可以了

 

Statement stmt = con.createStatement();
ResultSet rs=null;
rs=stmt.executeQuery(sql);
if(rs.next())
  count=rs.getInt(1);
不然你取的数据集是无效的,因为rs开始是指向第一组数据之前的

#!/bin/bash dayid=${1:-$(date +%Y-%m-%d)} echo $dayid PROJECT_ID=833 source /data/nfs/scripts/${PROJECT_ID}/hhweb_config.sh echo ${hhweb_db_user} ${hhweb_db_host} ${hhweb_db_port} ${hhweb_db_name} mysql -u${hhweb_db_user} -h${hhweb_db_host} -p${hhweb_db_pass} -P${hhweb_db_port} -D${hhweb_db_name} -v -e" CREATE TABLE IF NOT EXISTS bvreport.hhweb_yqy_user_orders_d ( province_name CHAR COMMENT '省份名称', new_order_users INT COMMENT '新增订购用户数', vip_name CHAR COMMENT '会员类型', dayid CHAR ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; DELETE FROM bvreport.hhweb_yqy_user_orders_d WHERE dayid = '${dayid}'; " hive -hiveconf dayid="${dayid}" -e " DROP TABLE IF EXISTS mgwh_rd_temp.product_vip_info_${dayid}; CREATE TABLE mgwh_rd_temp.product_vip_info_${dayid} AS SELECT product_id, vip_name FROM ( SELECT a.product_id, '体育会员' AS vip_name FROM mgwh_rd_video.dwd_dim_product_1d_full_daily a JOIN ( SELECT sub_busi_id FROM mgwh_rd_video.dwd_dim_sub_business_1d_full_daily WHERE dt = '${dayid}' AND business_name = '体育赛场' ) b ON a.sub_busi_id = b.sub_busi_id WHERE a.dt = '${dayid}' GROUP BY a.product_id UNION SELECT a.product_id, '钻石会员' AS vip_name FROM mgwh_rd_video.dwd_dim_product_1d_full_daily a JOIN ( SELECT sub_busi_id FROM mgwh_rd_video.dwd_dim_sub_business_1d_full_daily WHERE dt = '${dayid}' AND (business_id = 'BB000105301' OR sub_busi_id IN ('SB000110313', 'SB000110411', 'SB000110412')) ) b ON a.sub_busi_id = b.sub_busi_id WHERE a.dt = '${dayid}' GROUP BY a.product_id ) subquery; " hive -hiveconf dayid="${dayid}" -e " INSERT INTO bvreport.hhweb_yqy_user_orders_d (province_name, new_order_users, vip_name, dayid) SELECT a.province_name, COUNT(DISTINCT a.msisdn) as new_order_users, b.vip_name, '${dayid}' AS dayid FROM mgwh_rd_dwm.dwm_video_order_d a INNER JOIN mgwh_rd_temp.product_vip_info_${dayid} b ON a.product_id = b.product_id INNER JOIN defa
最新发布
03-25
<think>嗯,用户的问题是关于如何通过Bash脚本调用MySQL创建表,然后用Hive进行ETL操作。首先,我需要理解他们的需求。他们可能是在做数据仓库或者ETL流程,需要自动化这两个步骤。用户提到了代码审查和调试帮助,所以可能需要确保脚本的正确性和效率。 接下来,我得考虑如何分步回答。根据提供的引用内容,特别是引用[2]中的步骤,Hive处理包括建表、导入数据、清洗、分区,最后用Sqoop导出到MySQL。而引用[3]提到封装Shell脚本处理变量和调度。所以需要将这两部分结合起来。 用户可能需要具体的代码示例。首先,创建MySQL表的部分,使用Bash脚本中的mysql命令,指定用户名密码和数据库,执行建表语句。需要注意安全,比如不要在脚本中硬编码密码,可以使用配置文件或者环境变量。引用[3]提到保护生产库密码,所以应该建议使用mysql_config_editor或者从安全存储获取密码。 然后是Hive部分,需要建立源表、清洗表、分区表,可能还需要处理增量或全量数据。HiveQL脚本可以在Bash中通过hive -e或者-f执行。要确保Hive表的字段和数据类型与源数据匹配,清洗步骤可能需要过滤或转换数据。 另外,用户可能关心如何传递变量,比如日期或配置参数。引用[3]中提到通过Shell传递变量,方便后续调度,所以应该在脚本中使用变量,比如用${date}这样的占位符,并在调用时替换。 可能还需要考虑错误处理,比如每个步骤执行后检查返回值,确保上一步成功再继续。例如,在mysql建表后,如果失败则退出脚本,避免后续错误。 关于数据同步,引用[3]提到增量同步和全量同步的策略,可能需要根据业务需求选择。全量可能需要定期覆盖,而增量则追加数据。Hive的分区表可以帮助管理数据,特别是按时间分区的情况。 最后,导出到MySQL可能需要使用Sqoop,如引用[2]中的步骤。要确保Sqoop配置正确,包括连接参数和导出目录。同时,处理主键冲突或数据格式问题。 总结用户的潜在需求,他们需要一个可靠、可维护的脚本,能够安全地处理数据库连接,高效执行ETL流程,并且易于调度和扩展。因此,回答需要涵盖脚本结构、安全措施、错误处理、变量传递和具体代码示例,同时引用提供的参考资料来支持建议。</think>### 分步解决方案 #### 一、Bash脚本调用MySQL创建表 1. **安全连接MySQL** 使用`mysql`命令连接时避免明文密码,建议通过`mysql_config_editor`配置登录路径或使用环境变量: ```bash # 通过配置文件隐藏密码(示例) mysql --login-path=prod_db -e "CREATE TABLE IF NOT EXISTS target_table ( id INT PRIMARY KEY, data VARCHAR(255) );" ``` 2. **动态参数传递** 通过Shell变量传递表名、字段等参数,引用[3]中提到的变量传递方法: ```bash TABLE_NAME="target_table" mysql -u${USER} -p${PASSWORD} -h${HOST} -D${DB} <<EOF CREATE TABLE ${TABLE_NAME} (/* 字段定义 */); EOF ``` #### 二、Hive ETL操作实现 1. **Hive表与数据清洗** 根据引用[2],需先建立Hive源表并导入数据: ```sql -- 创建源表 CREATE EXTERNAL TABLE source_table (id INT, raw_data STRING) LOCATION '/data/source/'; -- 清洗并写入中间表 CREATE TABLE cleaned_table AS SELECT id, TRIM(raw_data) AS clean_data FROM source_table WHERE id IS NOT NULL; ``` 2. **分区表与增量处理** 按日期分区存储数据,支持增量同步: ```sql -- 创建分区表 CREATE TABLE partitioned_table (id INT, clean_data STRING) PARTITIONED BY (dt STRING); -- 动态分区插入(需启用Hive动态分区配置) INSERT INTO TABLE partitioned_table PARTITION(dt='${date}') SELECT id, clean_data FROM cleaned_table; ``` #### 三、封装Shell脚本整合流程 1. **脚本结构示例** 综合引用[2][3],脚本应包含元数据刷新、错误处理等: ```bash #!/bin/bash DATE=$(date +%Y%m%d) # MySQL建表 mysql -u${MYSQL_USER} -p${MYSQL_PWD} -e "CREATE TABLE IF NOT EXISTS orders_${DATE} (...);" # Hive ETL hive -e " INSERT OVERWRITE TABLE hive_partitioned_table PARTITION(dt='${DATE}') SELECT ... FROM cleaned_data; " # Sqoop导出到MySQL sqoop export \ --connect jdbc:mysql://${MYSQL_HOST}/target_db \ --table orders_${DATE} \ --export-dir /hive/path/dt=${DATE} ``` 2. **关键注意事项** - **安全性**:MySQL密码通过环境变量或密钥管理工具传递,避免脚本中明文存储[^3] - **原子性**:添加`set -e`使脚本遇错自动终止 - **日志追踪**:重定向输出到日志文件,便于调试 ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值