如何从单个目录

时间:2017-10-02 20:47:43

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

  • 我有一个加载和处理4TB数据的场景, 这是文件夹中大约15000个.csv文件。
  • 由于我的资源有限,我计划将它们分成两部分 批次和他们结合起来。
  • 我试图理解我是否只能加载50%(或者先加载n 批次1中的文件数量和批次2)中的其余文件使用
    spark.read.csv。

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

  • 有没有办法可以告诉spark.read.csv读取器选择前n个文件,然后我会提到加载最后的n-1个文件

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

1 个答案:

答案 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:])