【发布时间】:2017-08-26 06:57:43
【问题描述】:
我正在尝试将 JDBC ResultSet 转换为 Spark RDD,并且正在寻找一种使用 Spark 的并行功能来实现此目的的有效方法。
以下是我根据https://stackoverflow.com/a/32073423/6064131实现的内容
val rs:ResultSet = stmt .getResultSet
val colCount = rs.getMetaData.getColumnCount
def getRowFromResultSet(resultSet: ResultSet): String ={
var i:Int = 1
var rowStr=""
while(i<=colCount){
rowStr=rowStr+resultSet.getString(i)+delim
i+=1
}
rowStr
}
val resultSetList = Iterator.continually((rs.next(), rs)).takeWhile(_._1).map(r => {
getRowFromResultSet(r._2) // (ResultSet) => (spark.sql.Row)
}).toList
val x = sc.parallelize(resultSetList)
现在主要问题是它需要更多时间,我知道所有数据集都是通过一个针眼拉出来的。但是有没有更好的方法来实现这一点?
有些人可能想知道为什么我不使用内置功能 sqlContext.read.format 来实现这一点,原因是 Spark 在查询周围包装了“SELECT * FROM ( )”,这会导致复杂查询出现问题。 详情请参考链接Issue with WITH clause with Cloudera JDBC Driver for Impala - Returning column name instead of actual Data
【问题讨论】:
-
我猜你没试过 Spark 2?
-
@cricket_007 Spark 2 将如何发挥作用?
-
SparkSQL 代码的显着改进。只是好奇
标签: apache-spark jdbc rdd resultset