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