我在面试中遇到了一个设计架构的问题。但我怀疑在设计蜂巢中的模式时,我们是按照规范化过程还是不需要?请帮我理解
答案 0 :(得分:2)
使用Hive,一个好的做法是对数据进行非规范化。
连接需要一个reducer,这意味着数据已经在shuffle阶段进行了排序。如果需要对连接表中的字段进行过滤,则需要一个映射,一个shuffle,一个reduce(用于连接)和另一个过滤器映射。 (除非你的表足够小以适应映射器内存 - 默认情况下为10Mb)
地图(阅读) - >随机(排序) - >减少(加入) - >地图(过滤器) - >减少(写入)
对映射阶段的非规范化表中存在的字段进行过滤。
地图(阅读+过滤器) - >随机(排序) - >减少(写入)
使用高级存储格式(ORCfile,Parquet,...)可以获得更好的性能,这些格式可以在数据中添加一些元数据,允许在过滤阶段跳过块(谓词按下存储层)
只有在使用map-reduce hive引擎时,该答案才有效。使用另一个与Hive(Tez,Spark,...)或其他SQL-in-Hadoop软件(Impal,Drill,...)的工程,您可能会观察到不同的行为。
您可以在Hive manual page
中找到有关联接的更多信息