我正在使用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中这样做吗?