Apache Spark CSV转换为Parquet,4000列,20000个小文件

时间:2018-07-05 00:25:31

标签: apache-spark

我有大量的csv文件(大约20000个),其中大多数文件具有大约4000列,其中10%的文件可以具有更少或更多的列。 我想将这些文件从S3加载到spark中,从CSV文件推断架构,然后合并该架构以处理混合的架构文件。然后,在减少分区数量之后,以拼花形式写回S3。

    val df = spark.read.format("csv").option("header", "true").option("mergeSchema", "true").option("inferSchema", "true").load(<s3-in-path>)
df.coalesce(2).write.mode("overwrite").parquet(<s3-out-path)

但这要花几个小时才能完成,即使我扔了100个CPU内核。

有人领导如何处理此类数据吗?

1 个答案:

答案 0 :(得分:0)

  • Spark CSV模式推断是对文件的完整读取。不要那样做:提前制定模式
  • 可能发生在查询的分区阶段,而不是并行化的位
  • S3限制对象GET / HEAD调用上的IO,而您在这里做的很多

如果这是一项繁重的工作,并且数据集小于1 TB,则您是否考虑过仅在本地下载并以这种方式进行。读取所有源文件一次,您就可以随心所欲地玩Spark CSV加载,而不必担心节流或AWS费用