如何在 Impala 中存储图像文件

Posted

技术标签:

【中文标题】如何在 Impala 中存储图像文件【英文标题】:How to store Image file in Impala 【发布时间】:2017-03-01 06:50:07 【问题描述】:

我在本地系统中有一个图像文件(jpg 或 jpeg),我想存储在 Impala 数据库中,请帮助我怎么做?

【问题讨论】:

您想将图像存储在 HDFS 中并在“数据库”中保留对它的引用。还是您需要数据库中的实际内容?如果是第二个,并且您不能使用 Hive 将其存储为二进制数据,则必须找到一种方法将内容存储为 Impala 的字符串。 Storing binary data (e.g. images) using Hive, Impala community on binary data HDFS 或数据库都可以,但我想知道如何检索图像。 我认为您可以通过三种方式解决此问题。 1. 您找到一种将图像转换为字符串以输入数据库的方法,并在检索时使用相同的方法从字符串转换为图像。 (serializer-deserializer) 2. 您将图像存储在 HDFS 上,文件路径可能存储在数据库中。要检索图像,您需要一个从 Hadoop 中提取文件的脚本,类似于 this 3。您使用 Hive 并将图像存储为二进制文件。将二进制文件转换回图像将为您提供结果。 没关系,如果您有任何语法,请 ping。 【参考方案1】:

我认为您有几种方法可以解决此问题,具体取决于您的确切要求。

1.使用 Hive

Hive 允许您将二进制数据存储在 Hive“数据库”中。 Hive 与 Impala 类似,虽然通常速度较慢但功能更多。 您可以在表定义中使用数据类型BINARY,并使用LOAD DATA 加载图像。 像这样的东西可能会起作用(未经测试)。

Create table images (picture binary); 
LOAD DATA LOCAL inpath 'x/y/image.jpg' INTO TABLE images;

2。使用 Impala

黑斑羚does not allow binary data。您可以做的是使用序列化反序列化方法。这意味着您将图像转换为字符串格式,该格式仍包含将其转换回来所需的所有信息。一旦您需要在 HDFS 上检索图像,您将需要反序列化,这意味着将字符串转换为原始格式。

以 Python 为例,它的工作原理如下:

import base64

def img_to_string(image_path):
    with open(image_path, "rb") as imageFile:
        image_string= base64.b64encode(imageFile.read())
        print image_string

def string_to_img(image_string):
    with open("new_image.png", "wb") as imageFile:
        imageFile.write(str.decode('base64'))

3.仅使用 HDFS

通常不需要将数据存储在数据库中。您可以做的只是将图像放在 HDFS 中。如有必要,您可以将 HDFS 文件路径保存在数据库中。然后,您可以使用 Impala 查询检索路径。 然后从远程位置获取文件需要您运行以下命令(更多信息here):

ssh <user>@<host> "hadoop fs -get <hdfs_path> <os_path>"
then scp command to copy files

【讨论】:

请让我知道这些是否解决了您的问题,如果可以,请接受答案,以便其他人可以从我的解决方案中受益:) 我是新手,请告诉我如何接受答案:)

以上是关于如何在 Impala 中存储图像文件的主要内容,如果未能解决你的问题,请参考以下文章

如何在ColdFusion中上传图像文件后存储图像文件

如何将原始数据存储在图像文件中?

如何在通过php存储在文件夹中时更改图像名称

如何在 phpmyadmin 中正确存储和检索图像文件路径?

如何从本地存储中获取阵列图像到刀片文件

如何在mongodb中存储文件/图像的url?