在 MaprDB 中存储文档(.pdf、.doc 和 .txt 文件)

Posted

技术标签:

【中文标题】在 MaprDB 中存储文档(.pdf、.doc 和 .txt 文件)【英文标题】:Store documents (.pdf, .doc and .txt files) in MaprDB 【发布时间】:2016-12-17 03:27:39 【问题描述】:

我需要将 .pdf、.doc 和 .txt 文件等文档存储到 MaprDB。我在 Hbase 中看到了一个示例,它以二进制形式存储文件并在 Hue 中作为文件检索,但我不确定如何实现它。知道如何将文档存储在 MaprDB 中吗?

【问题讨论】:

【参考方案1】:

第一件事是,我不知道 Maprdb,因为我正在使用 Cloudera。但我有在 hbase 中将多种类型的对象存储为字节数组的经验,如下所述。


在 hbase 或任何其他数据库中存储的最原始方式是字节数组。 see my answer

您可以使用 Apache commons lang API 通过以下方式执行此操作。可能这是最好的选择,它将适用于所有对象,包括图像/音频/视频等。

请使用您的任何文件的对象类型之一测试此方法。 SerializationUtils.serialize 将返回字节。您可以插入。

import org.apache.commons.lang.SerializationUtils;
/**
* testSerializeAndDeserialize.
*
**/
public void testSerializeAndDeserialize throws Exception 

//serialize here
    byte[] bytes = SerializationUtils.serialize("your object here which is of type f  .pdf, .doc and .txt ");


 // deserialize the same here and see you are getting back or not.
 yourobjecttype objtypeofpdfortxtordoc = (yourobjecttype) SerializationUtils.deserialize(bytes);


注意:apache commons lang 的jar 在 hadoop 集群中始终可用。(不是外部依赖)

另一个例子:

import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.commons.lang.SerializationUtils;

public class SerializationUtilsTrial 
  public static void main(String[] args) 
    try 
      // File to serialize object to
      String fileName = "testSerialization.ser";

      // New file output stream for the file
      FileOutputStream fos = new FileOutputStream(fileName);

      // Serialize String
      SerializationUtils.serialize("SERIALIZE THIS", fos);
      fos.close();

      // Open FileInputStream to the file
      FileInputStream fis = new FileInputStream(fileName);

      // Deserialize and cast into String
      String ser = (String) SerializationUtils.deserialize(fis);
      System.out.println(ser);
      fis.close();
     catch (Exception e) 
      e.printStackTrace();
    
  


出于任何原因,如果您不想使用 Apache commons lang 提供的 SerializationUtils 类,那么您可以查看下面的 pdf 序列化和反序列化示例,以便您更好地理解,但如果您使用它的代码很长使用SerializationUtils会减少代码。

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

public class PdfSerializeAndDeserExample 

    public static void main(String[] args) throws FileNotFoundException, IOException 
        File file = new File("someFile.pdf");

        FileInputStream fis = new FileInputStream(file);
        //System.out.println(file.exists() + "!!");
        //InputStream in = resource.openStream();
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        byte[] buf = new byte[1024];
        try 
            for (int readNum; (readNum = fis.read(buf)) != -1;) 
                bos.write(buf, 0, readNum); //no doubt here is 0
                //Writes len bytes from the specified byte array starting at offset off to this byte array output stream.
                System.out.println("read " + readNum + " bytes,");
            
         catch (IOException ex) 
            Logger.getLogger(genJpeg.class.getName()).log(Level.SEVERE, null, ex);
        
        byte[] bytes = bos.toByteArray();

上面你得到字节数组,你可以准备把请求上传到数据库,即 Hbase 或任何其他数据库


一旦你坚持了,你可以使用 hbase get 或 scanget 你的 pdf 字节得到相同的结果,并使用下面的代码再次制作相同的文件,即在这种情况下为 someFile.pdf。

        File someFile = new File("someFile.pdf");
        FileOutputStream fos = new FileOutputStream(someFile);
        fos.write(bytes);
        fos.flush();
        fos.close();
    

编辑:既然你问了 HBASE 示例,我在下面的方法中添加了这个..

yourcolumnasBytearray 是您的 doc 文件,例如 pdf.. 在上述示例中转换为字节数组(使用 SerializationUtils.serialize)...

  /**
 * Put (or insert) a row
 */
@Override
public void addRecord(final String tableName, final String rowKey, final String family, final String qualifier,
                final byte[] yourcolumnasBytearray) throws Exception 
    try 
        final HTableInterface table = HBaseConnection.getHTable(getTable(tableName));
        final Put put = new Put(Bytes.toBytes(rowKey));
        put.add(Bytes.toBytes(family), Bytes.toBytes(qualifier), yourcolumnasBytearray);
        table.put(put);
        LOG.info("INSERT record " + rowKey + " to table " + tableName + " OK.");
     catch (final IOException e) 
        printstackTrace(e);
    

【讨论】:

感谢您的回复,我会尝试在 MaprDB 上进行。你有在 Hbase 上做过的例子吗? 添加了一个不带SerializationUtils的PDF序列/反序列化示例

以上是关于在 MaprDB 中存储文档(.pdf、.doc 和 .txt 文件)的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP (LAMP) 中创建文档(PDF、DOC、XLS 等)的缩略图预览

如何解决利用aspose把word文档转换为pdf文档时出现乱码 C#

Android:如何创建 .doc、.ppt、.xls、.pdf 格式的文档编辑器? [关闭]

Xamarin.Forms 将文件 (pdf) 保存在本地存储中并使用默认查看器打开

在 WKWebView swift 中下载文档并加载图像(png、jpeg)、pdf、doc 等

百度文库是如何实现在线阅读doc pdf ppt xls文档的