在 MaprDB 中存储文档(.pdf、.doc 和 .txt 文件)
Store documents (.pdf, .doc and .txt files) in MaprDB
我需要将.pdf、.doc 和.txt 等文档存储到MaprDB。我在 Hbase 中看到一个示例,它以二进制形式存储文件并在 Hue 中作为文件检索,但我不确定它是如何实现的。知道如何将文档存储在 MaprDB 中吗?
首先,我不知道 Maprdb,因为我正在使用 Cloudera。但是我有在 hbase 中将许多类型的对象作为字节数组存储在 hbase 中的经验,如下所述。
在 hbase 或任何其他数据库中存储的最原始方式是字节数组。
您可以使用 Apache commons lang API 通过以下方式完成此操作。这可能是最好的选择,它将适用于所有对象,包括 image/audio/video 等。
请使用您的任何文件的对象类型之一测试此方法。
SerializationUtils.serialize
将 return 字节。你可以插入。
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
class,那么你可以看下面的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 或 scan
你 get
你的 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);
}
我需要将.pdf、.doc 和.txt 等文档存储到MaprDB。我在 Hbase 中看到一个示例,它以二进制形式存储文件并在 Hue 中作为文件检索,但我不确定它是如何实现的。知道如何将文档存储在 MaprDB 中吗?
首先,我不知道 Maprdb,因为我正在使用 Cloudera。但是我有在 hbase 中将许多类型的对象作为字节数组存储在 hbase 中的经验,如下所述。
在 hbase 或任何其他数据库中存储的最原始方式是字节数组。
您可以使用 Apache commons lang API 通过以下方式完成此操作。这可能是最好的选择,它将适用于所有对象,包括 image/audio/video 等。
请使用您的任何文件的对象类型之一测试此方法。
SerializationUtils.serialize
将 return 字节。你可以插入。
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
class,那么你可以看下面的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 或 scan
你 get
你的 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);
}