首页 文章

PySpark输出文件数

提问于
浏览
0

我是Spark新手 . 我有一个简单的pyspark脚本 . 它读取一个json文件,展平它并将其作为镶木地板压缩文件写入S3位置 .

读取和转换步骤运行速度非常快,并使用50个执行程序(我在conf中设置) . 但写入阶段需要很长时间,只能写入一个大文件(480MB) .

保存的文件数量如何确定?写操作能以某种方式加速吗?

谢谢,拉姆 .

1 回答

  • 1

    输出的文件数等于要保存的RDD的分区数 . 在此示例中,RDD被重新分区以控制输出文件的数量 .

    尝试:

    repartition(numPartitions) - 随机重新调整RDD中的数据以创建更多或更少的分区并在它们之间进行 balancer . 这总是随机播放网络上的所有数据 .

    >>> dataRDD.repartition(2).saveAsTextFile("/user/cloudera/sqoop_import/orders_test")
    

    输出的文件数与RDD的分区数相同 .

    $ hadoop fs -ls /user/cloudera/sqoop_import/orders_test
    Found 3 items
    -rw-r--r--   1 cloudera cloudera          0 2016-12-28 12:52 /user/cloudera/sqoop_import/orders_test/_SUCCESS
    -rw-r--r--   1 cloudera cloudera    1499519 2016-12-28 12:52 /user/cloudera/sqoop_import/orders_test/part-00000
    -rw-r--r--   1 cloudera cloudera    1500425 2016-12-28 12:52 /user/cloudera/sqoop_import/orders_test/part-00001
    

    另请查看:coalesce(numPartitions)

    source-1 | source-2


    Update:

    textFile方法还采用可选的第二个参数来控制文件的分区数 . 默认情况下,Spark为文件的每个块创建一个分区(HDFS中默认为64MB),但您也可以通过传递更大的值来请求更多的分区 . 请注意,您不能拥有比块少的分区 .

    ...但这是最小数量的可能分区,因此无法保证 .

    所以如果你想在读取时进行分区,你应该使用这个....

    dataRDD=sc.textFile("/user/cloudera/sqoop_import/orders").repartition(2)
    

相关问题