Выборка большого распределенного набора данных с помощью pyspark / spark

у меня есть файл в hdfs, который распределяется по узлам в кластере.

Я пытаюсь получить случайную выборку из 10 строк из этого файла.

в оболочке pyspark я прочитал файл в RDD, используя:

>>> textFile = sc.textFile("/user/data/myfiles/*")

и тогда я хочу просто взять образец... классная вещь о Spark заключается в том, что есть такие команды, как takeSample, к сожалению, я думаю, что я делаю что-то неправильно, потому что следующее занимает очень много времени время:

>>> textFile.takeSample(False, 10, 12345)

поэтому я попытался создать раздел на каждом узле, а затем указать каждому узлу пример этого раздела, используя следующую команду:

>>> textFile.partitionBy(4).mapPartitions(lambda blockOfLines: blockOfLines.takeSample(False, 10, 1234)).first()

но это дает ошибку ValueError: too many values to unpack :

org.apache.spark.api.python.PythonException: Traceback (most recent call last):
  File "/opt/cloudera/parcels/CDH-5.0.2-1.cdh5.0.2.p0.13/lib/spark/python/pyspark/worker.py", line 77, in main
    serializer.dump_stream(func(split_index, iterator), outfile)
  File "/opt/cloudera/parcels/CDH-5.0.2-1.cdh5.0.2.p0.13/lib/spark/python/pyspark/serializers.py", line 117, in dump_stream
    for obj in iterator:
  File "/opt/cloudera/parcels/CDH-5.0.2-1.cdh5.0.2.p0.13/lib/spark/python/pyspark/rdd.py", line 821, in add_shuffle_key
    for (k, v) in iterator:
ValueError: too many values to unpack

как я могу попробовать 10 строк из большого распределенного набора данных с помощью spark или pyspark?

2 ответов


попробуйте использовать . takeSample обычно будет очень медленно, потому что это звонки count() на RDD. Он должен сделать это, потому что в противном случае он не будет принимать равномерно из каждого раздела, В основном он использует счетчик вместе с размером выборки, который вы просили, чтобы вычислить дробь и вызовы sample внутренне. sample быстро, потому что он просто использует случайный логический генератор, который возвращает true fraction процентов времени и, следовательно, не нужно звонить count.

кроме того, я не думаю, что это происходит с вами, но если возвращенный размер выборки недостаточно велик, он вызывает sample снова, что, очевидно, может замедлить его. Поскольку вы должны иметь некоторое представление о размере ваших данных, я бы рекомендовал вызвать sample, а затем сократить образец до размера себя, так как вы знаете больше о своих данных, чем spark.


использование sample вместо takeSample, похоже, делает вещи достаточно быстрыми:

textFile.sample(False, .0001, 12345)

проблема в том, что трудно выбрать правильную дробь, если у вас нет приблизительного представления о количестве строк в наборе данных.