我们要存储以下数据:
{"event":"click", "click_url":..., ...},
{"event":"view","view_item":...., ...}
每个事件(点击/查看/加载/点击...)都有不同的字段。
当前,我们将所有类型的事件归类到相同的Parquet文件中,最终以90个字段结束,大多数情况下为空(稀疏数据,因为对于观看事件,所有click_ *字段均为空)。
随着我们计划添加越来越多的事件,这是不可扩展的(我无法对超过128列的镶木地板文件进行成像!)
我们已经使用分区:year=2018/month=8/day=20
,单个Hive表和Apache Spark进行查询。
适合这种情况的最佳架构是什么(可能是按事件划分的分区并关联了Hive表)?
答案 0 :(得分:2)
您可以像已经在做的那样合并不同模式的内容。实际上,存储“稀疏”或“宽”数据(表中的列数很多,而单个记录中的列数少)是Parquet擅长的领域。某些文章摘录中提到了这一点:
来自Dremel made simple with Parquet:
具有很多空值的稀疏列将压缩为几乎没有内容
来自Parquet: Columnar Storage for Hadoop Data:
当查询是针对稀疏数据或列选择的基数较低时,Parquet确实很出色。
和
这对于从“宽”(具有很多列)表中读取特定列的查询特别有用,因为它只读取需要的列,并最大程度地减少了IO。”
您可能要在查询中提及特定的列,而不是进行SELECT *
来利用这一点。