2016-10-22 274 views
1

我们正在消耗非常大的数据,需要尽快写入,因为我们使用HDFS,因此我们更愿意使用它。数据几乎没有结构化,我们很少会对它们进行基本查询。数据与一些字段保持一致,每行代表另一个数据。HDFS上非结构化数据行的数据存储格式

key1=str key2=30.3 key3=longtexthere 

另一个数据行:

key1=3 key5=abc 

SequenceFile似乎是最自然的,但我无法找到如何多行存储在一个单一的SequenceFile。

目前,在我们的临时解决方案中,我们有多个写入多个文本文件的写入器。所以当需要查询时,我们会同时读取它们。但是,当前的文本文件包含1000行,我不认为为每行创建单个SequenceFile都是可行的,因此在查询时,它会一次性存储元数据并读取许多太多文件。

我认为这个问题可以通过使用HBase或Cassandra这样的columunar数据库来解决,但我们几乎需要使用HDFS。我是否遗漏了SequenceFiles或我们应该使用columunar数据库?

+0

你有固定数量的按键/列吗? – oae

+0

@oae不,虽然它们不是固定的,但它们很少被扩展,这意味着有时我们添加新的列,但旧数据没有它们。 – Mustafa

回答

1

所以序列文件格式是这样的: <key, value> <key, value> <key, value> ... 其中键是一个WritableComparable和值是一个Writable。 现在是什么,很多人都在做 - 你可以做同样的 - 是:

  • 只有使用钥匙或价值“列”
  • 实现自定义可写,它封装了一组其他Writables的(称之为记录,排,...)

这样你就可以建立你想要的一切。可写的记录可以有一个固定的模式,就像它包含'IntWritable,Text,IntWritable,IntWritable'(取决于你的字段)。或者如果你不想支持不同的类型,你可以使用现有的ArrayWritable作为你的'记录'。 了解每个文件的模式(例如,将其放入序列文件的元数据中,将允许您读取具有不同/演变模式的文件)

因此,其大量的手工制作,但构建可以非常有效灵活的结构从来没有使用它,但看看http://pangool.net/userguide/schemas.html,认为他们已经建模suche一个灵活的记录/元组架构上的序列文件顶部

底线,我认为你可以实现你想要的序列文件。 但是,我建议也看看列表文件格式,如ParquetORC files。这些来自他们自己的折衷,但你会有更高的压缩率和sel有效读取(列投影,滤波器下推)。你也不必发明模式/元组结构。