问题描述
我有 hive 外部表(以镶木地板格式存储的 s3 文件),用 spark 创建的大小约为 30 GB,有数百个分区。但是,我需要查询非分区列(例如 supplier_ID)上的数据以查看完整的交易历史记录,但不特定于某个时期或日期(分区列)。在我不确定 Hive 表上的哪个分区数据属于这种查询模式时,如何确保此查询模式?
解决方法
过滤查询结果时,parquet-mr API的消费者 (例如,Hive 或 Spark)可以从 API 获取所有记录并 然后根据过滤的谓词评估每条记录 状况。但是,这需要在内存中组装所有记录, 甚至不匹配的。使用谓词下推,这些条件是 改为传递给 parquet-mr 库,该库评估 较低级别的谓词并丢弃不匹配的记录 先组装它们。
例如,在评估记录 {title: "The Starry Night",width: 92,height: 74} 反对条件 height > 80,它不是 必须组装整个记录,因为它可以被丢弃 仅基于其高度属性。然而,虽然条件 高度 > 宽度也不匹配记录,谓词下推 在这种情况下不能使用,因为我们需要多个字段 评估谓词的相同记录。
此外,谓词下推还允许丢弃整行 不能包含基于其最小值/最大值的任何匹配项的组 统计数据。例如,如果一个行组的统计信息包括 {min: 62,max: 78} 用于高度列和过滤条件 高度 > 80,则该行组中的所有记录都无法匹配, 因此可以丢弃整个行组。
只需编写一个查询,Parquet 就具有上面列出的一些智能。它可以跳过各种组并使用列式存储来检查事物,这比读取/反序列化整行要快得多。