将JDBC ResultSet转换为Spark RDD/DataFrame

问题描述:

我试图将JDBC ResultSet转换为Spark RDD,并且正在寻找一种使用Spark的并行性特性来执行此操作的有效方法。将JDBC ResultSet转换为Spark RDD/DataFrame

下面是我已按本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) 

现在主要的问题是它正在采取更多的时间来实现我的理解所有数据集是通过一个针eye.But拉有没有更好的办法做到这一点?

有些人可能想知道为什么我不使用内置功能sqlContext.read.format来实现这一点,原因是Spark围绕正在创建复杂查询问题的查询包装“SELECT * FROM()”。 请参考链接Issue with WITH clause with Cloudera JDBC Driver for Impala - Returning column name instead of actual Data

+0

你没有尝试Spark 2,我猜? –

+0

@ cricket_007 Spark 2如何改变? –

+0

SparkSQL代码的重大改进。只是好奇 –

但是,有没有更好的方法来实现这一目标?

我不会重新发明轮子。如果您仍然遇到与最近的Spark版本(1.6是漂亮的旧版本)和JDBC驱动程序(我猜这是应该指责的)相同的问题,只需要CREATE VIEW并将其用于查询。

另外不要忘记提交一个错误报告。