【问题标题】:HDFS "files" that are directoriesHDFS“文件”是目录
【发布时间】:2017-08-10 19:01:50
【问题描述】:

背景——我们正在尝试将不同的文件类型(csv 或 parquet)读入 pyspark,我的任务是编写一个确定文件类型的程序。

parquet 文件似乎总是目录,parquet 文件在 HDFS 中作为目录出现。

我们有一些csv文件也是目录,其中文件名是目录名,目录包含几个部分文件。哪些流程可以做到这一点?

为什么有些文件是“文件”,有些文件是“目录”?

【问题讨论】:

    标签: hadoop pyspark hdfs parquet


    【解决方案1】:

    这取决于生成这些文件的进程。例如,当 MapReduce 产生输出时,它总是产生一个目录,然后在该目录中为每个 reducer 创建一个输出文件。这样做是为了让每个 reducer 都可以独立创建其输出。

    从 Spark 的CSV package 来看,它期望输出到单个文件。因此,单文件 CSV 可能由 Spark 生成,目录由 MapReduce 生成。

    为了尽可能通用,最好执行以下操作:检查相关文件是否为目录。如果没有,请检查扩展名。如果是,请查看目录内文件的扩展名。这应该适用于您的每种情况。

    请注意,某些输入格式(例如 MapReduce 输入格式)将接受目录作为输入,而某些(例如 Spark 的 textFile)将仅接受文件/文件团。您需要了解与您交互的库的预期内容。

    【讨论】:

    • 谢谢!这就是我错过的 Mapreduce 将文件作为目录吐出的原因。我一直在管理事情很长时间,以至于我从来没有看过 MR 实际对输出做了什么。由于我们的程序设计得非常通用,因此我需要为此添加一个案例,但现在我知道这些不同的“类型”来自何处。
    【解决方案2】:

    硬盘上的所有数据都由文件和文件夹组成。这 两者之间的基本区别是文件存储数据,而 文件夹存储文件和其他文件夹。

    Hadoop 执行引擎通常会根据使用的 reducer 或 executor 的数量创建一个目录并写入多个部分文件作为输出。

    当您有多个输出文件 abc.csv 时,这并不意味着它是包含数据的单个文件。它只是 MapReduce(通常)解释为要在其中创建输出文件(部分文件)的新目录的输出位置。 如果您在编写文件时使用 Spark(可能使用 .saveAsTextFile),它可能只会创建一个文件。

    【讨论】:

      猜你喜欢
      • 2016-09-14
      • 2016-05-13
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-21
      • 2016-12-10
      • 1970-01-01
      相关资源
      最近更新 更多