在HDFS内的拼花文件中存储异构数据的数据模式

时间:2018-09-21 11:51:56

标签: database hdfs parquet

我们要存储以下数据:

{"event":"click", "click_url":..., ...},
{"event":"view","view_item":...., ...}

每个事件(点击/查看/加载/点击...)都有不同的字段。

当前,我们将所有类型的事件归类到相同的Parquet文件中,最终以90个字段结束,大多数情况下为空(稀疏数据,因为对于观看事件,所有click_ *字段均为空)。

随着我们计划添加越来越多的事件,这是不可扩展的(我无法对超过128列的镶木地板文件进行成像!)

我们已经使用分区:year=2018/month=8/day=20,单个Hive表和Apache Spark进行查询。

适合这种情况的最佳架构是什么(可能是按事件划分的分区并关联了Hive表)?

1 个答案:

答案 0 :(得分:2)

您可以像已经在做的那样合并不同模式的内容。实际上,存储“稀疏”或“宽”数据(表中的列数很多,而单个记录中的列数少)是Parquet擅长的领域。某些文章摘录中提到了这一点:

来自Dremel made simple with Parquet

  

具有很多空值的稀疏列将压缩为几乎没有内容

来自Parquet: Columnar Storage for Hadoop Data

  

当查询是针对稀疏数据或列选择的基数较低时,Parquet确实很出色。

  

这对于从“宽”(具有很多列)表中读取特定列的查询特别有用,因为它只读取需要的列,并最大程度地减少了IO。”

您可能要在查询中提及特定的列,而不是进行SELECT *来利用这一点。