Apache Spark DataFrame 没有 RDD 分区
Apache Spark DataFrame no RDD partitioning
根据新的 Spark 文档,使用 Spark 的 DataFrame
should be preferred over using JdbcRDD
。
第一次接触非常愉快,直到我遇到第一个问题 - DataFrame
没有 flatMapToPair()
方法。第一个想法是把它转换成JavaRDD
,我做到了。
一切都很好,我使用这种方法编写了我的代码并注意到这样的代码:
JavaRDD<Row> myRDD = dataFrame.toJavaRDD();
int amount = myRDD.partitions().length
产生 1
。这种转换为 JavaRDD
下面的所有代码都是绝对低效的。强制对 RDD 进行重新分区会花费大量时间,并且比使用 1 个分区的代码产生更大的开销。
如何处理?
在使用 JdbcRDD
时,我们使用 "pager" 编写了特定的 SQL,例如用于创建分区的 WHERE id >= ? and id <= ?
。如何使用 DataFrame
?
制作这样的东西
`
val connectionString` = "jdbc:oracle:thin:username/password@111.11.1.11:1521:ORDERS"
val ordersDF = sqlContext.load("jdbc",
Map( "url" -> connectionString,
"dbtable" -> "(select * from CUSTOMER_ORDERS)",
"partitionColumn" -> "ORDER_ID",
"lowerBound"-> "1000",
"upperBound" -> "40000",
"numPartitions"-> "10"))
根据新的 Spark 文档,使用 Spark 的 DataFrame
should be preferred over using JdbcRDD
。
第一次接触非常愉快,直到我遇到第一个问题 - DataFrame
没有 flatMapToPair()
方法。第一个想法是把它转换成JavaRDD
,我做到了。
一切都很好,我使用这种方法编写了我的代码并注意到这样的代码:
JavaRDD<Row> myRDD = dataFrame.toJavaRDD();
int amount = myRDD.partitions().length
产生 1
。这种转换为 JavaRDD
下面的所有代码都是绝对低效的。强制对 RDD 进行重新分区会花费大量时间,并且比使用 1 个分区的代码产生更大的开销。
如何处理?
在使用 JdbcRDD
时,我们使用 "pager" 编写了特定的 SQL,例如用于创建分区的 WHERE id >= ? and id <= ?
。如何使用 DataFrame
?
`
val connectionString` = "jdbc:oracle:thin:username/password@111.11.1.11:1521:ORDERS"
val ordersDF = sqlContext.load("jdbc",
Map( "url" -> connectionString,
"dbtable" -> "(select * from CUSTOMER_ORDERS)",
"partitionColumn" -> "ORDER_ID",
"lowerBound"-> "1000",
"upperBound" -> "40000",
"numPartitions"-> "10"))