【问题标题】:Query non-partitioned column on Entire Hive external Table查询整个 Hive 外部表上的非分区列
【发布时间】:2021-08-25 20:29:09
【问题描述】:

我有使用 spark 创建的大约 30 GB 大小和数百个分区的配置单元外部表(以 parquet 格式存储的 s3 文件)。但是,我需要查询非分区列(例如 SUPPLIER_ID)上的数据以查看完整的事务历史记录,但不特定于期间或日期(分区列)。在我不确定 Hive 表中哪个分区数据属于这种情况下,如何确保这种查询模式?

【问题讨论】:

  • 只是不按分区过滤,也不在groupby中包含分区
  • 这将强制整个表扫描,其查询甚至可能无法完成
  • 看我的回答

标签: apache-spark hive apache-spark-sql hiveql dremio


【解决方案1】:

引用自: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", 宽度:92,高度:74}反对高度> 80的条件,它不是 有必要组装整个记录,因为它可以被丢弃 仅基于其高度属性。然而,虽然条件 高度>宽度也不匹配记录,谓词下推 在这种情况下不能使用,因为我们需要多个字段 相同的记录来评估谓词。

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

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

【讨论】:

  • 感谢蓝色幻影。听起来有镶木地板文件就足够了。但是除非您在过滤器中包含分区 col,否则我看不到更好的性能。是否有任何基准或参考,我们可以将数据量与预期查询运行时间进行比较
  • 你必须显示查询,因为我觉得它很奇怪
猜你喜欢
  • 2023-03-19
  • 2013-07-26
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多