2016-05-18 34 views
6

Mam wiadro na S3, które zawiera 1000 plików. Każda ma około 1 GB. Chciałbym przeczytać losową próbkę tych plików. Powiedzmy, że 5% wszystkich plików. To jak to zrobićOdczytywanie losowej próbki plików na S3 z Pyspark

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

Ale wydaje powyższy kod będzie czytać wszystkie pliki i następnie pobrać próbki. Chociaż chcę pobrać próbki plików i je przeczytać. Czy ktoś mógłby pomóc?

+0

Co to jest self.path? Czy używa on globowania? – nkadwa

+0

_self.path_ jest zmienną samoistną w Pythonie. – neikusc

Odpowiedz

2

Użyj swojej ulubionej metody, aby wyświetlić listę plików w ścieżce, pobrać próbkę imion, a następnie użyj 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) 

Oto jeden możliwy szybki i brudny realizacja „list_files”, które będą wymienione pliki w "katalogu" na 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('\n') 
    _r = [path + i.strip().split(' ')[-1] for i in _r] 
    return _r 
+0

To jest świetny pomysł. Bardzo dziękuję za odpowiedź! – neikusc