在 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 *
来利用这一点。
我们想像这样存储数据:
{"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 *
来利用这一点。