【问题标题】:Converting JDBC ResultSet to Spark RDD/DataFrame将 JDBC ResultSet 转换为 Spark RDD/DataFrame
【发布时间】: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


【解决方案1】:

但是有没有更好的方法来实现这一点?

我不会重新发明轮子。如果您在最近的 Spark 版本(1.6相当老)和 JDBC 驱动程序(我猜这是罪魁祸首)仍然遇到同样的问题,只需 CREATE VIEW 并将其用于查询。

别忘了提交错误报告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-03-25
    • 2018-03-05
    • 2017-06-02
    • 2023-03-28
    • 2017-06-13
    • 2018-10-21
    • 1970-01-01
    • 2016-05-12
    相关资源
    最近更新 更多