我有一个非常简单的SparkSQL连接到Postgres数据库的设置,我试图从表中获取DataFrame,其数据分区数为X(可以说是2)。代码如下:SparkSQL PostgresQL Dataframe分区
Map<String, String> options = new HashMap<String, String>();
options.put("url", DB_URL);
options.put("driver", POSTGRES_DRIVER);
options.put("dbtable", "select ID, OTHER from TABLE limit 1000");
options.put("partitionColumn", "ID");
options.put("lowerBound", "100");
options.put("upperBound", "500");
options.put("numPartitions","2");
DataFrame housingDataFrame = sqlContext.read().format("jdbc").options(options).load();
由于某种原因,DataFrame的一个分区几乎包含所有行。
对于我所能理解的lowerBound/upperBound
是用来微调的参数。在SparkSQL的文档(Spark 1.4.0 - spark-sql_2.11)中,它表示它们用于定义跨度,而不是过滤/范围分区列。但是这会产生以下几个问题:
- 步幅是每个执行器(分区)用于查询数据库的频率(每个查询返回的元素数)?
- 如果没有,这个参数的目的是什么,它们依赖于什么以及如何平衡我的DataFrame分区(不要求所有分区包含相同数量的元素,只是存在均衡 - 例如2个分区100个元素55/45,60/40或甚至65/35将会这样做)
似乎无法找到这些问题的明确答案,并想知道是否有些人可以清除这对我来说意义重大,因为在处理X百万行时,现在影响了我的集群性能,而所有繁重的工作都由一位执行者负责。
干杯和感谢您的时间。