在 HDFS 内的镶木地板文件中存储异构数据的数据模式

Data schema to store heterogeneous data in parquet files inside HDFS

我们想像这样存储数据:

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

每个事件(click/view/load/hit.....)都有不同的字段。

目前,我们将所有类型的事件分组在同一个 parquet 文件中,最终有 90 个字段,大部分时间为空(数据稀疏,因为对于视图事件,所有 click_* 字段都是空的)。

由于我们计划添加越来越多的事件,因此这是不可扩展的(我无法想象包含超过 128 列的镶木地板文件!)。

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

什么是最好的架构(可能是与 Hive table 相关联的按事件分区)以适应这种情况?

您可以像您已经在做的那样合并不同的模式。存储 "sparse" 或 "wide" 数据(table 中的大量列,但单个记录中的列数很少)实际上是 Parquet 擅长的领域。一些提到这个的文章摘录:

来自Dremel made simple with Parquet

A sparse column with a lot of null values will compress to almost nothing

来自Parquet: Columnar Storage for Hadoop Data

Parquet really excels when the query is on sparse data or low cardinality in column selection.

It is especially good for queries which read particular columns from a “wide” (with many columns) table, since only needed columns are read and IO is minimized."

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