【问题标题】:Prepare access to many DB tables for a possible later usage with spark准备对许多数据库表的访问,以供以后使用 spark
【发布时间】:2016-03-31 22:16:05
【问题描述】:

我正在使用 Spark 迈出第一步,目前正在研究通过 JDBC 驱动程序从数据库中导入一些数据的方法。 我的计划是我准备从 数据库供其他团队使用纯 SparkSQL 命令稍后使用。 这样他们就可以专注于数据,不再接触代码。

我与数据库的连接正常,到目前为止我发现了两种获取数据的工作方式。

方式一:

sqlContext.read.jdbc(url,"tab3",myProp).registerTempTable("tab3")

方式2:

case class RowClass_TEST (COL1:String, COL2:String)
val myRDD_TEST= new JdbcRDD(sc,() => DriverManager.getConnection(url,username,pw), "select * from TEST where ? < ?",  0,1,1,row => RowClass_TEST(row.getString("COL1"),row.getString("COL2")) myRDD_TEST.toDF().registerTempTable("TEST")

但是这两种方式都有一些不好的影响,

如果您必须准备更多以后不使用的表,方法 1 不会那么快。
(我在示例执行期间跟踪了 5 个 jdbc 突击队(创建连接、登录、设置、查询标头、终止连接))

方式 2 运行速度非常快,但来自 Scala 的 case class 有很大的限制。
此类类只能设置 22 个值。

那么有没有一个简单的解决方案来设置没有case class 的方式 2?
我想访问一些超过 22 列的数据库表。

我已经尝试让它工作,但我的 Scala 专业知识还不够好。

【问题讨论】:

  • 这种类只能设置 22 个值 - 很长一段时间都不是这样。
  • 啊,听起来不错。我正在使用 Zeppelin Web GUI 作为测试的前端,并从我的大 case class 收到一条错误消息(只是一个数字)。更新的 Scala 版本是否移除了边框?
  • 2.11 - issues.scala-lang.org/browse/SI-7296。但是仍然存在大约 22 个限制。
  • 更新:它是....版本 2.11.1 于 2014 年 5 月发布
  • link ==> Spark 还不支持 Scala 2.11 的 JDBC 组件。

标签: scala apache-spark


【解决方案1】:

你可以这样写:

sqlContext.load("jdbc",
      Map(
         "url" -> "jdbc:mysql://dbConnectionString",
         "dbtable" ->
            "(SELECT * FROM someTable WHERE someField > 10 ) AS a"
         )
   ).registerTempTable("tmp_table")

【讨论】:

  • 感谢您的帖子。我刚刚测试了这段代码,看起来它是上述方式 1 的旧语法。它的行为方式完全相同。我还在wireshark 中看到了5 个jdbc 突击队。但我也从中学到了一些东西。带有 sub 命令的版本可能对我的后续步骤有所帮助:D
  • 这就是问题所在,通过该子查询,您可以最大限度地减少您将处理的数据量。
  • 这不是我问题的答案,但你是对的。这是一个非常有价值的提示,因为使用正确的过滤器可以大大加快访问速度。我只用sqlContext.read.jdbc() 函数对其进行了测试,它也在那里工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
相关资源
最近更新 更多