apache-spark - 使用 jdbc slow 将 Spark 数据帧写入数据库(Exasol)
问题描述
我正在从 AWS(s3) 读取并写入数据库 (exasol) 花费了太多时间,即使设置批量大小不会影响性能。我正在写 618 万行(大约 3.5 GB),耗时 17 分钟
在集群模式下运行 20 节点集群
我怎样才能让它快
数据集 ds = session.read().parquet(s3Path)
ds.write().format("jdbc").option("user", username).option("password", password).option("driver", Conf.DRIVER).option("url", dbURL) .option("dbtable", exasolTableName).option("batchsize", 50000).mode(SaveMode.Append).save();
解决方案
好的,这是一个有趣的问题。
我没有检查最近发布的 Spark 连接器的实现细节。但是您可以使用一些以前存在的方法。
- 在 Hadoop 中将 Spark 作业结果保存为 CSV 文件。通过 WebHDFS http 调用从所有创建的文件运行标准并行导入。
- 据我所知,官方UDF 脚本能够直接从 Parquet 导入。
- 您可以实现自己的 Java UDF 脚本以按照您想要的方式读取 Parquet。例如,这就是它对ORC 文件的工作方式。
一般来说,实现某些实际性能的最佳方法是完全绕过 Spark。
推荐阅读
- javascript - 为什么我仍然收到“目标容器不是 DOM 元素”。在 ReactDom.render
- python-2.7 - Elasticsearch 返回错误的计数
- c# - ML.NET 算法正在评估有关乳腺癌的实例总是错误的
- swift - Swift 帮助从未来日期中提取月份值
- django - FileSystemStorage 不起作用,当上传 2 张图片时,返回 SuspiciousFileOperation 错误
- c# - 试图避免 c# Windows 应用程序中的循环依赖
- r - 如何在 R 中调试代码以使用 Dplyr 按组获取变量的标准差?
- python - 在未调用 Popup.open() 的方法中触发 Popup.dismiss() (kivy)
- javascript - 单击按钮后如何重置数据对象
- python - 在步骤函数中调用时如何返回 Python 粘合作业?