如何将API响应返回的图片保存至Hive数据库?
待处理原始JSON数据
{ "id":"1", "class_id":"2", "name":"bebeneo 204", "price":"16", "barcode":"72900000000", "item_img":"file/db_1p6.gif" }
核心需求:接口返回的item_img字段为图片相对路径,需拼接服务器地址前缀得到完整可访问地址后,将数据存入Hive数据库。
具体实现方案
Hive本身不适合存储大体积二进制文件,根据业务场景选择对应方案即可:
方案1:Hive存储图片访问路径(生产环境首选)
该方案存储成本极低、查询性能好,绝大多数业务场景都用这个方式:Hive中仅保存图片的可访问地址,图片文件本身存在图片服务/HDFS/对象存储上。
- 第一步:数据预处理
解析接口返回的JSON数据,对item_img字段做拼接处理:完整图片地址 = 固定图片服务前缀 + item_img字段值,例如固定前缀为https://www.imageserver.com/时,拼接后得到的完整地址为https://www.imageserver.com/file/db_1p6.gif。拼接前注意判断字段值是否已经带域名前缀,避免重复拼接导致地址失效。 - 第二步:创建Hive业务表
图片地址字段用STRING类型即可,建表语句参考:
CREATE TABLE IF NOT EXISTS item_info ( id STRING, class_id STRING, name STRING, price DECIMAL(10,2), barcode STRING, item_img_url STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS ORC;
- 第三步:数据导入
将解析、拼接完成的结构化数据落到HDFS临时目录,通过LOAD DATA或者外部表映射的方式批量导入Hive表即可,后续使用时直接读取item_img_url字段就能拿到图片访问地址。
方案2:Hive存储图片二进制内容(仅适合归档类场景)
如果业务要求必须把图片文件本身和业务数据绑定存在Hive中,按以下步骤操作:
- 第一步:数据预处理
- 解析JSON、拼接得到完整图片地址,逻辑同方案1
- 编写ETL脚本(Python/Java均可),遍历每条数据,通过完整图片地址下载图片文件,将图片转为二进制字节流,也可以转成Base64编码字符串方便传输
- 第二步:创建Hive业务表
存二进制流用BINARY类型,存Base64编码内容用STRING类型,建表语句参考:
CREATE TABLE IF NOT EXISTS item_info_with_img_bin ( id STRING, class_id STRING, name STRING, price DECIMAL(10,2), barcode STRING, item_img BINARY ) STORED AS ORC;
- 第三步:数据导入
将处理好的二进制内容/Base64字符串和其他业务字段一起导入Hive表即可。
注意:该方案会导致Hive表体积暴涨,查询性能大幅下降,如果单张图片体积超过10MB,更推荐把图片存在HDFS/对象存储中,Hive仅存储文件路径,逻辑同方案1。
内容的提问来源于stack exchange,提问作者HamZa
相关产品推荐
相关产品推荐

