Sqoop的导入导出案例

本文分享了一个用于处理水暖器加热时间数据的Shell脚本,该脚本从Greenplum导出数据到HDFS,接着计算加热时间业务指标,并最终将结果导入回Greenplum数据库。

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

[root@master2 script]# cat run_waterheater_heattime.sh 
#!/bin/bash

#if [ x$1 = x ]
#then
#    echo '请输入当前日期格式为%Y%m%d';
#    exit 0;
#fi

today=`date -d '1 day ago' +"%Y%m%d"`
echo $today

#export greenplum data to hdfs
hdfs dfs -rm -R /user/root/waterheater-data/source/heat-time/$today
sqoop import  \
--connect jdbc:postgresql://host:port/haieredw \
--username fuck \
--password fuck \
--query "SELECT devicetype,fmacid,fts,ftime from (SELECT '06001001'::varchar as devicetype,fmacid,fts,ftime from waterheater.amb_06001001_status_16 where f60600t='306001' and dayid = $today and \$CONDITIONS group by fmacid,fts,ftime UNION ALL SELECT '06002001'::varchar as devicetype,fmacid,fts,ftime from waterheater.amb_06002001_status_16 where f60f004='30f0S1' and dayid = $today and \$CONDITIONS group by fmacid,fts,ftime UNION ALL SELECT '06004001'::varchar as devicetype,fmacid,fts,ftime from waterheater.amb_06004001_status_16 where f60600t='306001' and dayid = $today and \$CONDITIONS group by fmacid,fts,ftime UNION ALL SELECT '06005001'::varchar as devicetype,fmacid,fts,ftime from waterheater.amb_06005001_status_16 where f60607qq='306001' and dayid = $today and \$CONDITIONS group by fmacid,fts,ftime UNION ALL SELECT '06006001'::varchar as devicetype,fmacid,fts,ftime from waterheater.amb_06006001_status_16 where f60600t='306001' and dayid = $today and \$CONDITIONS group by fmacid,fts,ftime) v order by fts"  \
--fields-terminated-by ','  \
--split-by 'fmacid' \
--target-dir /user/root/waterheater-data/source/heat-time/$today

#calculate heattime biz...
hdfs dfs -rm -R /user/root/waterheater-data/out/heat-time/$today
hadoop jar ../executable/apidocs-0.0.1-SNAPSHOT-jar-with-dependencies.jar com.ilifang.samples.bigdata.apidocs.App -D dayid=$today /user/root/waterheater-data/source/heat-time/$today /user/root/waterheater-data/out/heat-time/$today

#import data to greenplum
sqoop export \
--connect 'jdbc:postgresql://host:port/haieredw' \
--username fuck \
--password fuck \
--table heat_time_tmp \
--fields-terminated-by ',' \
--export-dir /user/root/waterheater-data/out/heat-time/$today \
--columns "devicetype,day_id,mac,dayhour,time" \
-- --schema waterheater

echo 'hahah...'

 

转载于:https://my.oschina.net/ibobby/blog/750836

### Sqoop 配置导出数据到 HDFS 的解决方案 Sqoop 是一种用于在 Hadoop 和关系型数据库之间传输数据的工具。虽然通常情况下,Sqoop 更常用于将数据从 MySQL 或其他 RDBMS 导入到 HDFS 中,但它也可以反向操作,即将 HDFS 上的数据导出到关系型数据库中。 以下是关于如何使用 Sqoop 将数据从 HDFS 导出到 MySQL 的具体配置和示例: #### 1. 基本语法结构 要实现从 HDFS 到 MySQL 的数据导出,可以使用 `sqoop export` 命令。其基本形式如下: ```bash bin/sqoop export \ --connect jdbc:mysql://<hostname>:<port>/<database_name> \ --username <username> \ --password <password> \ --export-dir <HDFS_directory_path> \ --input-fields-terminated-by '<delimiter>' \ --table <mysql_table> ``` 其中各个选项的作用说明如下[^1]: - `--connect`: 指定 JDBC 连接字符串,指向目标 MySQL 数据库。 - `--username` 和 `--password`: 提供访问 MySQL 所需的身份验证信息。 - `--export-dir`: 指定 HDFS 文件夹路径,该文件夹下的数据会被导出至 MySQL 表。 - `--input-fields-terminated-by`: 定义字段分隔符,默认为制表符 `\t`。 - `--table`: 指定接收数据的目标 MySQL 表名。 #### 2. 实际案例演示 假设有一个名为 `/user/hive/weblog_data` 的 HDFS 路径,里面存储着日志条目数据,并希望将其导出到 MySQL 数据库中的 `weblogs` 表,则可运行以下命令: ```bash bin/sqoop export \ --connect jdbc:mysql://localhost:3306/testdb \ --username root \ --password secret \ --export-dir /user/hive/weblog_data \ --input-fields-terminated-by ',' \ --table weblogs ``` 此命令会尝试连接本地主机上的 MySQL 数据库实例 (`testdb`) 并把位于指定 HDFS 路径内的 CSV 格式的记录写入到 `weblogs` 表中[^2]。 需要注意的是,在执行上述命令前,应该确认几个前提条件已经满足: - **MySQL 表存在**: 目标表必须事先创建完成,因为 Sqoop 不支持自动建表功能。 - **数据匹配度检查**: 确保 HDFS 文档里的每一列都与 MySQL 表定义相吻合,包括顺序、数目以及兼容的数据类型。 #### 3. 处理复杂场景 对于更复杂的环境设置或者特殊需求(比如分区处理),可以通过增加额外参数进一步定制化行为。例如,如果想利用多个 MapReduce 工作线程加速整个过程的话,可以用 `--num-mappers N` 参数指明并发数;又或者是当源数据含有空白字符或其他非标准编码时调整输入格式解析逻辑等。 --- ### 示例代码片段 这里提供一段完整的脚本作为参考模板: ```bash #!/bin/bash # 设置变量简化管理 MYSQL_HOST="localhost" MYSQL_PORT=3306 DATABASE_NAME="my_database" TABLE_NAME="employees" USERNAME="root" PASSWORD="mypassword" # 启动 Sqoop Export 流程 bin/sqoop export \ --connect "jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/${DATABASE_NAME}" \ --username ${USERNAME} \ --password ${PASSWORD} \ --export-dir "/path/to/data/in/HDFS" \ --input-fields-terminated-by '\t' \ --lines-terminated-by '\n' \ --table ${TABLE_NAME} ``` 以上脚本封装了必要的细节以便于重复调用或集成进自动化流程里去。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值