加载或指向多个 parquet 路径以使用 hive 或 prestodb 进行数据分析

Posted

技术标签:

【中文标题】加载或指向多个 parquet 路径以使用 hive 或 prestodb 进行数据分析【英文标题】:Loading or pointing to multiple parquet paths for data analysis with hive or prestodb 【发布时间】:2016-08-06 11:28:41 【问题描述】:

我有几个在 AWS S3 中生成 parquet 文件的 spark 作业。每隔一段时间,我需要对这些数据的给定日期范围运行一些临时查询。我不想在 spark 中执行此操作,因为我希望我们对 spark 不了解的 QA 团队能够执行此操作。我喜欢做的是启动一个 AWS EMR 集群并将 parquet 文件加载到 HDFS 并针对它运行我的查询。我已经弄清楚如何使用 hive 创建表并将其指向一个 s3 路径。但这将我的数据限制在一天。因为日期的每一天在

之类的路径下都有多个文件

s3://mybucket/table/date/(parquet files 1 ... n).

所以问题之一是如何将多天的数据加载到配置单元中。即

s3://mybucket/table_a/day_1/(parquet files 1 ... n). s3://mybucket/table_a/day_2/(parquet files 1 ... n). s3://mybucket/table_a/day_3/(parquet files 1 ... n). ... s3://mybucket/table_b/day_1/(parquet files 1 ... n). s3://mybucket/table_b/day_2/(parquet files 1 ... n). s3://mybucket/table_b/day_3/(parquet files 1 ... n).

我知道 hive 可以支持分区,但我的 s3 文件不是这样设置的。

我还研究了prestodb,它看起来是此类数据分析最喜欢的工具。它支持 ansi SQL 的事实使其成为具有 SQL 知识但对 hadoop 或 spark 知之甚少的人的绝佳工具。我确实在我的集群上安装了它,它工作得很好。但看起来你不能真正将数据加载到你的表中,你必须依靠 Hive 来完成这部分。这是使用 prestodb 的正确方法吗?我看了netflix presentation 关于他们使用 prestodb 和使用 s3 代替 HDFS 的内容。如果这很好用,但我想知道如何将数据移入内存。什么时候拼花文件将从 s3 移动到集群。我需要有可以将整个数据加载到内存中的集群吗?这一般是怎么设置的?

【问题讨论】:

AWS Athena 我猜是在提出这个问题后发布的? 【参考方案1】:

与其尝试加载多个文件,不如使用 API 将您想要的日期连接到一个对象中,然后您可以通过您已经提到的方式加载该对象。

AWS 有一篇博文重点介绍了如何完全通过 API 来执行此操作(无需下载 + 重新上传数据): https://ruby.awsblog.com/post/Tx2JE2CXGQGQ6A4/Efficient-Amazon-S3-Object-Concatenation-Using-the-AWS-SDK-for-Ruby

【讨论】:

【参考方案2】:

您可以在 S3 中安装 Hive 并使用您的数据创建 Hive 表,请参阅此处的博文:https://blog.mustardgrain.com/2010/09/30/using-hive-with-existing-files-on-s3/

然后在 AWS 上安装 Presto,配置 Presto 连接你之前安装的 hive 目录。然后您可以使用 SQL 使用 Presto 在 S3 上查询您的数据。

【讨论】:

这里的关键理解(对我来说)是 Presto 还不支持CREATE EXTERNAL TABLE。所以你必须使用 Hive 创建它,然后你可以使用 Presto 查询它。

以上是关于加载或指向多个 parquet 路径以使用 hive 或 prestodb 进行数据分析的主要内容,如果未能解决你的问题,请参考以下文章

从多个 parquet 路径创建 Spark SQL 表

Parquet 文件上 groupby 的最佳实践

使用 spark 将 parquet 数据从 Google 云存储加载到 BigQuery

如何使用 dask/fastparquet 从多个目录中读取多个 parquet 文件(具有相同架构)

Parquet文件结构笔记

在不加载到内存的情况下将 HDF5 转换为 Parquet