查询整个 Hive 外部表上的非分区列

问题描述

我有 hive 外部表(以镶木地板格式存储的 s3 文件),用 spark 创建的大小约为 30 GB,有数百个分区。但是,我需要查询非分区列(例如 supplier_ID)上的数据以查看完整的交易历史记录,但不特定于某个时期或日期(分区列)。在我不确定 Hive 表上的哪个分区数据属于这种查询模式时,如何确保此查询模式?

解决方法

引用自:https://docs.cloudera.com/documentation/enterprise/6/6.3/topics/cdh_ig_predicate_pushdown_parquet.html

过滤查询结果时,parquet-mr API的消费者 (例如,Hive 或 Spark)可以从 API 获取所有记录并 然后根据过滤的谓词评估每条记录 状况。但是,这需要在内存中组装所有记录, 甚至不匹配的。使用谓词下推,这些条件是 改为传递给 parquet-mr 库,该库评估 较低级别的谓词并丢弃不匹配的记录 先组装它们。

例如,在评估记录 {title: "The Starry Night",width: 92,height: 74} 反对条件 height > 80,它不是 必须组装整个记录,因为它可以被丢弃 仅基于其高度属性。然而,虽然条件 高度 > 宽度也不匹配记录,谓词下推 在这种情况下不能使用,因为我们需要多个字段 评估谓词的相同记录。

此外,谓词下推还允许丢弃整行 不能包含基于其最小值/最大值的任何匹配项的组 统计数据。例如,如果一个行组的统计信息包括 {min: 62,max: 78} 用于高度列和过滤条件 高度 > 80,则该行组中的所有记录都无法匹配, 因此可以丢弃整个行组。

只需编写一个查询,Parquet 就具有上面列出的一些智能。它可以跳过各种组并使用列式存储来检查事物,这比读取/反序列化整行要快得多。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...