我在hdfs中有一个文件,它分布在集群中的节点上.
我正试图从这个文件中随机抽取10行.
在pyspark shell中,我使用以下命令将文件读入RDD:
>>> textFile = sc.textFile("/user/data/myfiles/*")
Run Code Online (Sandbox Code Playgroud)
然后我想简单地拿一个样本......关于Spark的一个很酷的事情是有类似的命令takeSample,不幸的是我认为我做错了,因为以下需要很长时间:
>>> textFile.takeSample(False, 10, 12345)
Run Code Online (Sandbox Code Playgroud)
所以我尝试在每个节点上创建一个分区,然后使用以下命令指示每个节点对该分区进行采样:
>>> textFile.partitionBy(4).mapPartitions(lambda blockOfLines: blockOfLines.takeSample(False, 10, 1234)).first()
Run Code Online (Sandbox Code Playgroud)
但这会给出一个错误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
Run Code Online (Sandbox Code Playgroud)
如何使用spark或pyspark从大型分布式数据集中采样10行?