java—在maprdb中存储文档(.pdf、.doc和.txt文件)

myss37ts  于 2021-06-10  发布在  Hbase
关注(0)|答案(1)|浏览(291)

我需要存储文件,如.pdf,.doc和.txt文件到maprdb。我在hbase中看到一个例子,它以二进制形式存储文件,并以色调作为文件检索,但我不确定如何实现它。你知道如何在maprdb中存储文档吗?

bbuxkriu

bbuxkriu1#

首先,我不知道maprdb,因为我使用cloudera。但我有在hbase中以字节数组的形式存储多种类型对象的经验,如下所述。
在hbase或任何其他数据库中存储数据的最基本方式是字节数组。看看我的答案
您可以使用ApacheCommonsLangAPI以下面的方式实现这一点。可能这是最好的选择,它将适用于所有对象,包括图像/音频/视频等。。
请使用任何文件的对象类型之一测试此方法。 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);

}

注意:apachecommons 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();
    }
  }
}

如果你不想使用 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();

上面是字节数组,您可以准备put请求上传到数据库,即hbase或任何其他数据库

一旦你坚持,你可以得到相同的使用hbase获取或扫描你得到你的pdf字节,并使用下面的代码再次使相同的文件,即somefile.pdf在这种情况下。

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

编辑:既然你问了hbase的例子,我就加上这个。。在下面的方法中 yourcolumnasBytearray 是您的文档文件,例如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);
    }

相关问题