如果你们中的某人可以指导我将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中使用它。
任何帮助将不胜感激。
提前谢谢!
答案 0 :(得分:2)
针对公开源代码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|
....
....
答案 1 :(得分:1)
尝试一下
(没有尝试过,但应该稍作修改即可)
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
}
参考文献: