【问题标题】:Filtering data while reading from S3 to Spark从 S3 读取到 Spark 时过滤数据
【发布时间】:2018-11-09 17:26:24
【问题描述】:

我们正在迁移到 AWS EMR/S3 并使用 R 进行分析(sparklyr 库)。我们在 S3 中有 500gb 的销售数据,其中包含多个产品的记录。我们想要分析几个产品的数据,并且只想将文件的子集读取到 EMR 中。

到目前为止,我的理解是spark_read_csv 将提取所有数据。 R/Python/Hive 有没有办法只读取我们感兴趣的产品的数据?

【问题讨论】:

  • read_csv() 不会在传统意义上“拉入所有数据”——spark 是惰性的,所以在你执行一个动作之前什么都不会做。阅读后跟filter() 可能是你想去这里的方式。
  • 如果您的数据集按产品或 pdct 系列进行了分区,则只会访问与您的 WHERE 子句匹配的“目录”。这就是它在 Hadoop 和其他任何地方的工作方式(因为 20 年前 Oracle 8i 引入了这个概念......)
  • 执行 read_csv 不应该已经将整个数据加载到 HDFS 中吗?我知道 spark_read_csv 可以从 S3 读取文件并将其放入 hdfs。如果我将该命令通过管道传递给过滤器,它会起作用吗?所以本质上 - spark_read_csv(cs, sales.csv, memory = F) %>% filter(product == p1) ?我有文本文件形式的数据,每个文件都包含一年的数据。我不确定在将数据从 S3 拉入 EMR 时如何使用分区概念。你能澄清一下吗?

标签: r hive pyspark amazon-emr sparklyr


【解决方案1】:

简而言之,格式的选择与有效频谱相反。

使用数据

  • 由感兴趣的列(DataFrameWriterpartitionBy 选项或正确的目录结构)分区。
  • 由感兴趣的列上的(bucketBy 选项DataFrameWriter 和持久元存储)聚类。

在某些情况下可以帮助将搜索范围缩小到特定分区,但如果filter(product == p1) 具有高度选择性,那么您可能正在寻找错误的工具。

根据要求:

  • 适当的数据库。
  • Hadoop 上的数据仓库。

可能是更好的选择。

您还应该考虑选择更好的存储格式(如 Parquet)。

【讨论】:

  • 我同意。整个团队对这个基础设施都很陌生,在进一步阅读时,我们决定使用 parquet 文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-25
  • 2018-09-04
  • 1970-01-01
  • 2020-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多