使用Pyspark读取S3上随机的文件样本

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Pyspark读取S3上随机的文件样本相关的知识,希望对你有一定的参考价值。

我在S3上有一个包含1000个文件的存储桶。每个约1GB。我想阅读这些文件的随机样本。让我们说5%的文件。我就是这样做的

fileDF = sqlContext.jsonRDD(self.sc.textFile(self.path).sample(withReplacement=False, fraction=0.05, seed=42).repartition(160))

但似乎上面的代码将读取所有文件然后采样。虽然我想采取文件样本并阅读它们。有人可以帮忙吗?

答案

使用您喜欢的方法列出路径下的文件,获取名称样本,然后使用RDD union:

import pyspark
import random

sc = pyspark.SparkContext(appName = "Sampler")
file_list = list_files(path)
desired_pct = 5
file_sample = random.sample(file_list, int(len(file_list) * desired_pct / 100))
file_sample_rdd = sc.emptyRDD()
for f in file_sample:
    file_sample_rdd = file_sample_rdd.union(sc.textFile(f))
sample_data_rdd = file_sample_rdd.repartition(160)

这是一个可能的快速和脏的“list_files”实现,它将列出S3上“目录”下的文件:

import os
def list_files(path, profile = None):
    if not path.endswith("/"):
        raise Exception("not handled...")
    command = 'aws s3 ls %s' % path
    if profile is not None:
        command = 'aws --profile %s s3 ls %s' % (profile, path)
    result = os.popen(command)
    _r = result.read().strip().split('
')
    _r = [path + i.strip().split(' ')[-1] for i in _r]
    return _r

以上是关于使用Pyspark读取S3上随机的文件样本的主要内容,如果未能解决你的问题,请参考以下文章

无法使用本地 PySpark 从 S3 读取 json 文件

使用 pyspark 从 s3 位置读取镶木地板文件的文件夹到 pyspark 数据帧

使用 pyspark 从 s3 读取/加载 avro 文件

无法从 S3 读取 csv 到 AWS 上 EC2 实例上的 pyspark 数据帧

Pyspark 从 S3 存储桶读取 csv 文件:AnalysisException:路径不存在

PySpark S3 文件读取性能考虑