【发布时间】:2016-12-23 09:39:03
【问题描述】:
我已经在 HDFS 中导入了一个巨大的数据集(1.5 TB 压缩)。数据分为 3 个集合:users、items 和 events。这些集合基本上是充满.bz2 文件的文件夹,每个文件包含许多记录,采用TAB 分隔格式,每行一个。架构如下:
用户:
id: stringage: stringsex: string
项目:
id: stringdata: string (JSON format)
事件:
user_id: stringevent_id: stringtime: bigintitem_id: stringpos: intcity: stringstate: stringdevice: stringproperty: stringinteraction: int
我想在这个数据集上运行几个不同的查询,其中大多数涉及加入 events 和 users 或 events 和 items 在相应的*_id 字段上(它们是所述集合的外键)。
我已经将所有这些数据导入 HDFS 并创建了外部表。查询有效,但非常昂贵。特别是在涉及 events 表时,其压缩的 .bz2 文件总计约为 1 TB。我对 Hive 的经验很少,但我读过有关分区、集群和索引的信息。似乎通过巧妙的设计,我可以加快查询速度,尤其是对于连接。
我的问题是,您对三张表的高效设计有何建议?我经常需要的查询涉及以下操作之一:
- 加入活动和用户
- 加入活动和项目
- 加入所有三个表
- 按
age、sex、state、city或property(不同时)分组或过滤并聚合 - 按
time排序和过滤并聚合
我知道,也许并非所有这些都可以通过单一设计有效地完成,因此我愿意在必要时创建副本。我的集群中有大约 18 TB 的总可用空间(这里我没有考虑 Hadoop 的复制,所以总空间实际上更少)。
数据是静态的,即将来不会改变。如需其他参考,请参阅Yahoo Y10 News Feed dataset。
奖励:理想情况下,如果数据以以后 Pig 可以轻松访问的格式存储,那就更好了!
【问题讨论】:
-
我不认为
relational-database标签在这里是一致的! -
好的,已编辑。感谢您的回复。我现在正在阅读它。