Spark SQL Scala - 在 JDBCRDD 中获取列名
Spark SQL Scala - Fetch column names in JDBCRDD
我是 Spark 和 Scala 的新手。我正在尝试从 SQL-server 中的过程中获取内容以在 Spark SQL 中使用它。为此,我在 Scala (Eclipse) 中通过 JDBCRDD 导入数据,并从过程中创建一个 RDD。
创建 RDD 后,我将其注册为临时 table,然后使用 sqlContext.sql("Select query to select particular columns")。但是当我在 select 查询中输入列名时,它会抛出一个错误,因为我在 RDD 和临时 table.
中都没有列名
请在下面找到我的代码:
val driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
val url = XXXX
val username = XXXX
val password = XXXX
val query = "select A, B, C, D from Random_Procedure where ID_1 = ? and ID_2 = ?"
// New SparkContext
val sc = new SparkConf().setMaster("local").setAppName("Amit")
val sparkContext = new SparkContext(sc)
val rddData = new JdbcRDD(sparkContext, () =>
DriverManager.getConnection(url, username, password),
query, 1, 0, 1, (x: ResultSet) => x.getString("A") + ", " +
x.getString("B") + ", " + x.getString("C") + ", " +
x.getString("D")).cache()
val sqlContext = new SQLContext(sparkContext)
import sqlContext.implicits._
val dataFrame = rddData.toDF
dataFrame.registerTempTable("Data")
sqlContext.sql("select A from Data").collect.foreach(println)
当我 运行 这段代码时,它抛出一个错误:无法解析 'code' 给定的输入列 _1;
但是当我运行:
sqlContext.sql("select * from Data").collect.foreach(println)
它打印所有列 A、B、C、D
我相信我没有在我创建的 JdbcRDD 中获取列名,因此它们在临时 table 中不可访问。我需要帮助。
问题是你创建了 JdbcRDD 对象,你需要 DataFrame. RDD simple doesn't contain information about mapping from your tuples to column names. So you should create DataFrame from jdbc source as it explained in programming guide 而且:
Spark SQL also includes a data source that can read data from other
databases using JDBC. This functionality should be preferred over
using JdbcRDD
另请注意,Spark 1.3.0 中添加了 DataFrames。如果您使用旧版本,则必须使用 org.apache.spark.sql.SchemaRDD
进行操作
我是 Spark 和 Scala 的新手。我正在尝试从 SQL-server 中的过程中获取内容以在 Spark SQL 中使用它。为此,我在 Scala (Eclipse) 中通过 JDBCRDD 导入数据,并从过程中创建一个 RDD。
创建 RDD 后,我将其注册为临时 table,然后使用 sqlContext.sql("Select query to select particular columns")。但是当我在 select 查询中输入列名时,它会抛出一个错误,因为我在 RDD 和临时 table.
中都没有列名请在下面找到我的代码:
val driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"
val url = XXXX
val username = XXXX
val password = XXXX
val query = "select A, B, C, D from Random_Procedure where ID_1 = ? and ID_2 = ?"
// New SparkContext
val sc = new SparkConf().setMaster("local").setAppName("Amit")
val sparkContext = new SparkContext(sc)
val rddData = new JdbcRDD(sparkContext, () =>
DriverManager.getConnection(url, username, password),
query, 1, 0, 1, (x: ResultSet) => x.getString("A") + ", " +
x.getString("B") + ", " + x.getString("C") + ", " +
x.getString("D")).cache()
val sqlContext = new SQLContext(sparkContext)
import sqlContext.implicits._
val dataFrame = rddData.toDF
dataFrame.registerTempTable("Data")
sqlContext.sql("select A from Data").collect.foreach(println)
当我 运行 这段代码时,它抛出一个错误:无法解析 'code' 给定的输入列 _1;
但是当我运行: sqlContext.sql("select * from Data").collect.foreach(println) 它打印所有列 A、B、C、D
我相信我没有在我创建的 JdbcRDD 中获取列名,因此它们在临时 table 中不可访问。我需要帮助。
问题是你创建了 JdbcRDD 对象,你需要 DataFrame. RDD simple doesn't contain information about mapping from your tuples to column names. So you should create DataFrame from jdbc source as it explained in programming guide 而且:
Spark SQL also includes a data source that can read data from other databases using JDBC. This functionality should be preferred over using JdbcRDD
另请注意,Spark 1.3.0 中添加了 DataFrames。如果您使用旧版本,则必须使用 org.apache.spark.sql.SchemaRDD