【问题标题】:Hadoop Spark - Store in one Large File instead of Many Small ones and IndexHadoop Spark - 存储在一个大文件中而不是许多小文件和索引中
【发布时间】:2018-06-04 16:26:16
【问题描述】:

我每天都会计算一些统计数据并将其存储在一个文件中(大约 40 行数据)。下面的df是每天计算的。问题是当我每天存储它时它会变成一个新文件,我不想这样做,因为 hadoop 不能很好地处理多个小文件。我无法覆盖该文件,因为我也需要历史数据。

  1. 我如何每天制作一个大文件 - 即我写入同一个主文件而不是每天写入一个新文件。

  2. 我知道你可以使用 coalese(1) 我认为但我读到这是性能很差所以我不知道?

  3. 我想通过文件中的时间列来索引这个文件。我如何实现这一目标?

    df.repartition(1).write.save(mypath, format='parquet',mode='append', header='true')
    

【问题讨论】:

  • 40 行数据仍然很小。您确定需要 Hadoop 来存储它吗?
  • 可能不会。但是我在 hadoop 中有其余的数据,所以我仍然没有弄清楚如何将它们保存在不同的位置并且仍然可以轻松地在同一个问题中使用。如果您有任何参考架构,我会很乐意阅读 :) 问题是我以微秒、秒和 1 小时存储统计信息。一小时文件非常小,但是微秒文件很大,所以可能需要 hadoop。所以我想将它保存在同一个文件系统中,而不为此使用另一个数据库。因此问题

标签: apache-spark hadoop pyspark apache-spark-sql hadoop-partitioning


【解决方案1】:

您可以通过这样做每天覆盖相同的旧文件。 DF.write.mode(SaveMode.Overwrite)

【讨论】:

  • 我无法覆盖该文件,因为我还需要旧文件中的数据。所以在第 1 天我将有 40 个数据点,在第二天我有另外 40 个数据点但是它需要附加到主文件(40 + 40 = 80 个数据点)
  • @Secret 你可以df.partitonBy("datetime").write... 获取分区文件夹
  • @cricket_007:谢谢。如果有意义的话,我确实不想对其进行分区,而是将其写入一个大文件中。所以每天我都会附加到同一个主文件而不是每天的多个文件夹?因此分区将不起作用
  • @SecretAgent 不,如果您按日期文件夹进行分区,那么您将只创建和覆盖该日期文件夹。比如data/day=20180530,那么第二天就用data/day=20180531
  • @cricket_007:谢谢。我目前正在做类似的事情。但我想我想要做的是附加到同一个文件。如果我执行上述操作,我可能会有几天的时间处理包含大约 30 行数据的文件,这不会非常有效。
猜你喜欢
  • 2017-03-28
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多