【问题标题】:Convert Resultset to Dataframe将结果集转换为数据框
【发布时间】:2018-08-08 06:22:27
【问题描述】:

如果你们中的某个人可以指导我将 scala(或 java)结果集转换为 spark Dataframe,我会很高兴。

我不能使用这个符号:

val jdbcDF = spark.read
  .format("jdbc")
  .option("url", "jdbc:mysql://XXX-XX-XXX-XX-XX.compute-1.amazonaws.com:3306/")
  .option("dbtable", "pg_partner")
  .option("user", "XXX")
  .option("password", "XXX")
  .load()

所以在将我推荐给this similar question之前,请考虑到这一点。

我不能使用该表示法的原因是我需要使用我正在使用的当前版本的 spark (2.2.0) 中不存在的 jdbc 配置,因为我想使用“queryTimeout”选项最近在spark 2.4版本中添加了,所以需要在ResultSet中使用。

任何帮助将不胜感激。

提前谢谢你!

【问题讨论】:

    标签: java scala apache-spark


    【解决方案1】:

    一个针对公共源 mySQL 的工作示例

    import java.util.Properties
    import org.apache.spark.rdd.JdbcRDD
    import java.sql.{Connection, DriverManager, ResultSet}
    import org.apache.spark.implicits.
    
    val url = "jdbc:mysql://mysql-rfam-public.ebi.ac.uk:4497/Rfam"
    val username = "rfamro"
    val password = ""
    val myRDD = new JdbcRDD( sc, () => DriverManager.getConnection(url, username, password), "select rfam_id, noise_cutoff from family limit ?, ?", 1, 100, 10,                  
                        r => r.getString("rfam_id") + ", " + r.getString("noise_cutoff"))
    val DF = myRDD.toDF
    DF.show
    

    返回:

    +-------------------+
    |              value|
    +-------------------+
    |    5_8S_rRNA, 41.9|
    |           U1, 39.9|
    |           U2, 45.9|
    |         tRNA, 28.9|
    |        Vault, 33.9|
    |          U12, 52.9|
    ....
    ....
    

    【讨论】:

    • 我正在努力...我将尝试两种解决方案来为我的案例选择最佳答案,但再次感谢老兄的支持
    • 很好,但我的确实有效,而且它们很可能是免费的。我想我真的回答了。我只是提到它,因为我发现很多人在这里没有得到行为准则
    【解决方案2】:

    试试这个

    (没试过,但应该稍作修改)

    import java.sql.ResultSet
    import org.apache.spark.sql.DataFrame
    
    // assuming ResultSet comprises rows of (String, Int)
    def resultSetToDataFrame(resultSet: ResultSet): DataFrame = {
      val resultSetAsList: List[(String, Int)] = new Iterator[(String, Int)] {
        override def hasNext: Boolean = resultSet.next()
    
        override def next(): (String, Int) = {
          // can also use column-label instead of column-index
          (resultSet.getString(0), resultSet.getInt(1))
        }
      }.toStream.toList
    
      import org.apache.spark.implicits._
      val listAsDataFrame: DataFrame = resultSetAsList.toDF("column_name_1", "column_name_2")
    
      listAsDataFrame
    }
    

    参考资料:

    【讨论】:

    • 谢谢各位,我试试看
    猜你喜欢
    • 2018-01-12
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 2020-06-02
    相关资源
    最近更新 更多