我使用spark从postgres表中读取数据,并将其作为json转储到Google云存储。这张桌子很大,有100多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");发布于 2019-07-11 05:48:22
有两个重载的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);
https://stackoverflow.com/questions/56972600
复制相似问题