首页 > 解决方案 > 无需交换/洗牌的镶木地板数据的火花重写投影

问题描述

我的任务是再次使用更改的架构在压缩的镶木地板文件中写入 TB 的数据(每天分成 200 多个分区)。基本上我使用 spark sql 将架构调整为我的新格式。一些列被铸造,另一些被重新计算或拆分。

然后我想用尽可能少的文件保存结果 repartition($year,$month,$day).write.partitionBy(year,month,day).parquet(..)

数据源是由相同 y、m、d 列组成的分区表。因此,理论上它应该无需任何交换步骤即可工作,只需花一天时间将其写入新位置并更改数据/模式即可。

我认为整个工作应该是网络绑定读/写到/从 s3。

但这没有用。spark EMR 集群首先尝试读取所有数据,将数据打乱,然后将其写回。这是一个问题,因为我没有建立一个庞大的集群。最终数据不适合 RAM,然后如果磁盘空间被随机播放临时文件填满,则形成交换步骤。

我最终只是将工作分解为极其缓慢且低效的串行步骤。这花了很长时间。

TL;博士; 如何在 Spark 中处理这种原始(投影)ETL 作业?它基本上只是一个投影,没有连接,只有分区的合并。

读取数据-> 项目列-> 写入数据(分区)我想避免 DAG 中的交换步骤,或者这只是用 spark 不可能。

标签: apache-spark

解决方案


推荐阅读