如何在 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 中存储图像文件的主要内容,如果未能解决你的问题,请参考以下文章