Spark的df.saveAsParquetFile在S3

时间:2015-10-23 06:52:06

标签: amazon-s3 apache-spark amazon-emr parquet

我正在使用Spark 1.3.1将csv.gz文件转换为Parquet。我的数据集的第二个字段包含表单的时间戳:

yyyy-MM-dd hh:mm:ss

对于输出,每个MM-dd在我们的AWS S3存储桶中都有自己的文件夹/分区。

val textFile = sc.textFile(<S3 path containing csv.gz files>)

val grouped = textFile.map({ row =>

    val cols = row.split(",")

    (cols(1).substring(5, 10), row)

}).groupByKey

grouped成为[String,Iterable [String]]的RDD, 条目的示例如下所示:

"08-15", CompactBuffer(rowStr_1, rowStr_2, ..., rowStr_n)

下一步是将每个键的Iterable作为RDD,然后写为Parquet

val groupedRDD = grouped.collect

groupedRDD.foreach ({ group =>

    val rdd = sc.parallelize(group._2.toSeq)

    // group._1 is MM-dd
    rdd.toDF().saveAsParquetFile(<s3_bucket + parquet_folder> + group._1)

})

我已经在我的机器的HDFS中进行了测试,它运行正常。当我尝试在AWS S3上使用它时,文件夹是使用它们的Parquet文件生成的,但是也有写入零格式文件的格式

MM-dd_$folder$

因此看起来分区有重复,如下所示:

08-15
08-15_$folder$
08-16
08-16_$folder$
.
.
.

当我使用替代方案时,

rdd.toDF().save(<s3_bucket + parquet_folder> + group._1, "parquet")

结果是一样的。

在上面的Spark 1.4.0中,这应该是

rdd.toDF().write.parquet(<hdfs or s3 path>)

我无法测试它是否可以在AWS S3中运行,因为我们当前的EMR集群仅限于版本1.3.1

有人可以回答为什么Spark会在S3中这样做吗?

0 个答案:

没有答案