我试图将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
答案 0 :(得分:0)
但有没有更好的方法来实现这个目标?
我不会重新发明轮子。如果您仍然遇到与最近的Spark版本(1.6 相当旧)和JDBC驱动程序(我猜它是应该责备的那个)的同一问题,只需CREATE VIEW
并将其用于查询。
另外,不要忘记提交错误报告。