【问题标题】:How to load only first n files in pyspark spark.read.csv from a single directory如何从单个目录仅加载 pyspark spark.read.csv 中的前 n 个文件
【发布时间】:2017-10-02 20:47:42
【问题描述】:
  • 我有一个场景,我正在加载和处理 4TB 的数据, 一个文件夹中大约有 15000 个 .csv 文件。
  • 由于我的资源有限,我计划分两次处理它们 批次,然后将它们合并。
  • 我试图了解我是否只能加载 50%(或第一个 n 批处理 1 中的文件数和批处理 2 中的其余文件数)使用
    spark.read.csv.

  • 我不能使用正则表达式,因为这些文件是生成的 来自多个来源,它们的数量是奇数(来自一些 来源很少,而其他来源有很多)。如果我 考虑使用通配符或正则表达式以不均匀的批次处理文件 我可能无法获得优化的性能。

  • 有没有办法让 spark.read.csv 阅读器选择前 n 个文件,然后我只想提到加载最后 n-1 个文件

  • 我知道这可以通过编写另一个程序来完成。但我不喜欢,因为我有超过 20000 个文件,我不想遍历它们。

【问题讨论】:

    标签: csv pyspark pyspark-sql apache-spark-2.0


    【解决方案1】:

    如果您先使用 hadoop API 列出文件,然后根据此列表块创建数据帧,这很容易。例如:

    path = '/path/to/files/'
    from py4j.java_gateway import java_import
    
    fs = spark._jvm.org.apache.hadoop.fs.FileSystem.get(spark._jsc.hadoopConfiguration())
    list_status = fs.listStatus(spark._jvm.org.apache.hadoop.fs.Path(path))
    paths = [file.getPath().toString() for file in list_status]
    
    df1 = spark.read.csv(paths[:7500])
    df2 = spark.read.csv(paths[7500:])
    

    【讨论】:

    • 感谢您的帮助。上面提到的hadoop工作。我提到的文件夹实际上位于 s3 位置。我也会更新问题陈述。
    • 如果您的文件在 s3 上,该代码将起作用。您只需要在第三行获取 s3 文件系统而不是默认文件系统。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    相关资源
    最近更新 更多