将JDBC ResultSet转换为Spark RDD / DataFrame

时间:2017-08-26 06:57:44

标签: apache-spark jdbc rdd resultset

我试图将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

1 个答案:

答案 0 :(得分:0)

  

但有没有更好的方法来实现这个目标?

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

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