gpt4 book ai didi

postgresql - 在简单的读写上激发 OOM

转载 作者:行者123 更新时间:2023-11-29 13:09:19 27 4
gpt4 key购买 nike

我正在使用 spark 从 postgres 表中读取并将其作为 json 转储到 Google 云存储。该表很大,有数百个 GB。该代码相对简单(请参见下文)但因 OOM 而失败。似乎 spark 在开始写入之前试图在内存中读取整个表。这是真的?我怎样才能改变行为,使其以流方式读取和写入?

谢谢。

SparkSession sparkSession = SparkSession
.builder()
.appName("01-Getting-Started")
.getOrCreate();
Dataset<Row> dataset = sparkSession.read().jdbc("jdbc:postgresql://<ip>:<port>/<db>", "<table>", properties);
dataset.write().mode(SaveMode.Append).json("gs://some/path");

最佳答案

有几个重载 DataFrameReader.jdbc()用于在输入上拆分 JDBC 数据的方法。

jdbc(String url, String table, String[] predicates, java.util.Properties connectionProperties) - 生成的 DataFrame 将为每个给定的谓词分配一个分区,例如

String[] preds = {“state=‘Alabama’”, “state=‘Alaska’”, “state=‘Arkansas’”, …};
Dataset<Row> dataset = sparkSession.read().jdbc("jdbc:postgresql://<ip>:<port>/<db>", "<table>", preds, properties);

jdbc(String url, String table, String columnName, long lowerBound, long upperBound, int numPartitions, java.util.Properties connectionProperties) - Spark 将根据数字列划分数据 columnName进入numPartitions lowerBound 之间的分区和 upperBound包括在内,例如:

Dataset<Row> dataset = sparkSession.read().jdbc("jdbc:postgresql://<ip>:<port>/<db>", "<table>", “<idColumn>”, 1, 1000, 100, properties);

关于postgresql - 在简单的读写上激发 OOM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56972600/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com