我使用以下代码导出hbase表并将输出保存到hdfs:
hbase org.apache.hadoop.hbase.mapreduce.Export \
MyHbaseTable1 hdfs://nameservice1/user/ken/data/exportTable1
输出文件是二进制文件。如果我使用pyspark读取文件夹:
test1 = sc.textFile('hdfs://nameservice1/user/ken/data/exportTable1')
test1.show(5)
它显示:
u'SEQ\x061org.apache.hadoop.hbase.io.ImmutableBytesWritable%org.apache.hadoop.hbase.client.Result\x00\x00\x00\x00\x00\x00\ufffd-\x10A\ufffd~lUE\u025bt\ufffd\ufffd\ufffd&\x00\x00\x04\ufffd\x00\x00\x00'
u'\x00\x00\x00\x067-2010\ufffd\t'
u'|'
u'\x067-2010\x12\x01r\x1a\x08clo-0101 \ufffd\ufffd\ufffd*(\x042\\6.67|10|10|10|7.33|6.67|6.67|6.67|6.67|6.67|6.67|5.83|3.17|0|0|0.67|0.67|0.67|0.67|0|0|0|0|0'
u'u'
我看得出来
第二行的“7-2010”是行键,
第4行的“r”是列族,
第4行中的'clo-0101'是列名,
“6.67 | 10 | 10 | 7.33 | 6.67 | 6.67 | 6.67 | 6.67 | 6.67 | 5.83 | 3.17 | 0 | 0.67 | 0.67 | 0.67 | 0.67 | 0 | 0 | 0”是值。
我不知道3号线和5号线是从哪里来的。hbase export似乎遵循自己的规则生成文件,如果我使用自己的方法对其进行解码,数据可能会损坏。
问题:
如何将此文件转换回可读格式?例如:
7-2010, r, clo-0101, 6.67|10|10|10|7.33|6.67|6.67|6.67|6.67|6.67|6.67|5.83|3.17|0|0|0.67|0.67|0.67|0.67|0|0|0|0|0
我试过:
test1 = sc.sequenceFile('/user/youyang/data/hbaseSnapshot1/', keyClass=None, valueClass=None, keyConverter=None, valueConverter=None, minSplits=None, batchSize=0)
test1.show(5)
和
test1 = sc.sequenceFile('hdfs://nameservice1/user/ken/data/exportTable1'
, keyClass='org.apache.hadoop.hbase.mapreduce.TableInputFormat'
, valueClass='org.apache.hadoop.hbase.io.ImmutableBytesWritable'
, keyConverter='org.apache.spark.examples.pythonconverters.ImmutableBytesWritableToStringConverter'
, valueConverter='org.apache.spark.examples.pythonconverters.HBaseResultToStringCon verter'
, minSplits=None
, batchSize=100)
运气不好,代码不起作用,错误:
原因:java.io.ioexception:找不到值类的反序列化程序:“org.apache.hadoop.hbase.client.result”。如果使用自定义序列化,请确保配置“io.serializations”配置正确。
有什么建议吗?谢谢您!
1条答案
按热度按时间2lpgd9681#
我最近也有这个问题。我通过远离
sc.sequenceFile
,而不是使用sc.newAPIHadoopFile
(如果您使用的是旧的api,也可以使用hadoopfile)。spark sequencefile reader似乎只处理可写类型的键/值(如文档中所述)。如果你使用
newAPIHadoopFile
它使用hadoop反序列化逻辑,您可以在提供给它的配置字典中指定所需的序列化类型:注意,hadoop\u conf中“io.serializations”的值是一个逗号分隔的列表,其中包括“org.apache.hadoop.hbase.mapreduce.resultserialization”。这是反序列化结果所需的关键配置。为了能够反序列化immutablebyteswritable,还需要writableserialization。
你也可以使用
sc.newAPIHadoopRDD
,但是您还需要为配置字典中的“mapreduce.input.fileinputformat.inputdir”设置一个值。