【问题标题】:Tool for querying large numbers of csv files查询大量csv文件的工具
【发布时间】:2016-01-14 05:25:39
【问题描述】:

我们有大量的 csv 文件,文件/目录按日期和其他几个因素进行分区。例如,文件可能被命名为 /data/AAA/date/BBB.csv

有数千个文件,其中一些大小在 GB 范围内。总数据大小以 TB 为单位。

它们只会被附加到并且通常是批量的,因此写入性能并不那么重要。我们不想将它加载到另一个系统中,因为我们运行的几个重要进程依赖于能够快速流式传输文件,这些文件是用 c++ 编写的。

我正在寻找允许直接从数据中查询数据的类似 sql 的工具/库。我已经开始研究 hive、spark 和其他大数据工具,但不清楚它们是否可以直接从源访问分区数据,在我们的例子中是通过 nfs。

理想情况下,我们可以通过给出列的描述以及分区信息来定义表。此外,文件被压缩,因此处理压缩将是理想的。

他们的开源工具可以做到这一点吗?我见过一个名为 Pivotal 的产品,它声称可以做到这一点,但我们更愿意为开源分布式查询系统的数据编写自己的驱动程序。

任何线索将不胜感激。

【问题讨论】:

  • 正如@isaac.hazan 所说,Apache Drill 1.4 为您提供了平面文件的 SQL 接口。美妙之处在于,您不必提及绝对文件。分区中的文件夹层次结构应该可以。您的示例 /data/AAA/date/BBB.csv - 针对 AAA 中所有文件夹下的所有文件触发类似 select count(*) from dfs.root.'/data/AAA/'; 的查询。
  • Apache Drill是否允许您通过属性指定分区函数?例如,假设您在 /data/TAG1_A/yyyy-mm-dd.csv、/data/TAG1_B/yyyy-mm-dd.csv 中有数据,但您只想查询特定年份的数据,是否存在Apache Drill 只知道搜索某些文件的任何方式?另一个可能的查询可能只涉及 TAG1 的一些值,它不必遍历所有 TAG1_XXX 文件。我希望它更像是数据库中的分区表。

标签: c++ hive amazon-redshift distributed-computing bigdata


【解决方案1】:

Spark 可以是一个解决方案。它是在内存中的分布式处理引擎。数据可以加载到集群中多个节点的内存中,并且可以在内存中进行处理。您不需要将数据复制到另一个系统。

以下是您的案例的步骤:

  1. 构建多节点spark集群
  2. 将 NFS 挂载到其中一个节点上
  3. 然后你要以RDD的形式将数据临时加载到内存中并开始处理

它提供

  1. 支持 scala、python、java 等编程语言
  2. 支持 SQL 上下文和数据帧。您可以定义数据结构并开始使用 SQL 查询进行访问
  3. 支持多种压缩算法

限制

  1. 数据必须装入内存才能由 Spark 处理
  2. 您需要使用数据框来定义数据结构,之后您可以使用嵌入在 scala、python、java 等编程语言中的 sql 查询数据
  3. RDBMS 中的传统 SQL 与 Spark 等分布式系统中的 SQL 之间存在细微差别。您需要了解这些。

使用 hive,您需要将数据复制到 HDFS。由于您不想将数据复制到另一个系统,hive 可能不是解决方案。

【讨论】:

  • 对于 Spark,听起来您必须手动将数据加载到内存中。我希望有一些可以映射分区的东西,这样当您跨文件查询时,您不必显式加载每个文件。
猜你喜欢
  • 2019-11-06
  • 2021-03-09
  • 2019-06-10
  • 2015-05-19
  • 2020-11-10
  • 1970-01-01
  • 2014-04-09
  • 2010-09-13
  • 1970-01-01
相关资源
最近更新 更多