apache-spark - 无需交换/洗牌的镶木地板数据的火花重写投影
问题描述
我的任务是再次使用更改的架构在压缩的镶木地板文件中写入 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 不可能。
解决方案
推荐阅读
- python - Itertools 笛卡尔积无序
- excel - 使用 vba 从 SAP 确认框中获取 Gettig 文本
- python - 在共享主机系统上使用 pyzbar 的问题
- python - 使用 selenium (python) 循环遍历 webelements 列表以检索属性会产生 StaleElementReferenceException
- html - 如何从控制器中的返回中删除用户
- pandas - Python Pandas 按所有列分组
- android - 在Android上打开工作表时检查名称=周数的工作表是否存在
- javascript - 如果缺少某些项目,请在 JavaScript 中连接名称
- javascript - Firefox 中内联元素的 CSS 大纲属性与 Chrome/Safari 不同。Javascript解决方案?
- azure - Azure App Service 将 100% 扩展,我关闭了一切并重新启动