如何从HBase Shell导出PDF二进制文件?
解决HBase Shell导出PDF二进制文件损坏的问题
你的问题核心在于HBase Shell是为文本交互设计的,它会把二进制数据转义成\xXX这类文本格式的转义符,还会额外输出timestamp、value前缀等元数据,这些无关内容混入PDF后直接破坏了文件的结构,导致无法正常打开。下面是具体的解决思路和可行方法:
为什么当前方法失效?
你用hbase shell输出的内容并不是原始的二进制数据:
- 实际存储的PDF字节被转义成了
\x06、\x44这类文本字符; - 输出里还包含了
file:data timestamp=xxx, value='和结尾的'这些冗余内容; - 管道、
grep这类文本处理工具本身就不适合处理二进制,会进一步干扰数据完整性(比如对空字节、换行符的异常处理)。
修复方法:还原原始二进制数据
我们需要先剥离无关的元数据,再把转义的文本还原成原始二进制字节:
步骤1:提取纯转义内容
先通过命令过滤掉多余的标签,只保留value='和'之间的转义文本:
echo "get 'myfiles', '3ifecre1Row', {COLUMN=>'file:data'}" | hbase shell | grep "^ " | sed -e "s/^.*value='//" -e "s/'$//" > escaped_pdf.txt
步骤2:转义文本还原为二进制
用Python处理转义字符的还原(Python在字符编码处理上比bash更可靠):
python3 -c "import sys; sys.stdout.buffer.write(sys.stdin.read().encode('utf-8').decode('unicode_escape').encode('latin-1'))" < escaped_pdf.txt > testfile.pdf
执行完这两步后,生成的testfile.pdf应该就能正常打开了。
更优方案:避免用HBase Shell导出二进制
如果需要频繁导出二进制文件,推荐直接使用HBase的原生导出工具,比如MapReduce导出命令:
hbase org.apache.hadoop.hbase.mapreduce.Export myfiles hdfs:///tmp/myfiles_export 1 DURATION=1 COLUMN=file:data
之后从HDFS下载导出的文件,这样能直接获取原始二进制数据,彻底规避转义问题。
内容的提问来源于stack exchange,提问作者Stellar Sword
相关产品推荐
相关产品推荐

