Выборка большого распределенного набора данных с помощью 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)
проблема в том, что трудно выбрать правильную дробь, если у вас нет приблизительного представления о количестве строк в наборе данных.