Spark DataFrame不在JDBC数据源

时间:2015-10-01 08:20:36

标签: jdbc apache-spark apache-spark-sql

我已经注册了一个MySQL数据源,如下所示:

val driver = "com.mysql.jdbc.Driver"
val url = "jdbc:mysql://address=(protocol=tcp)(host=myhost)(port=3306)(user=)(password=)/dbname"

val jdbcDF = sqlContext.load("jdbc", Map(
  "url" -> url,
  "driver" -> driver,
  "dbtable" -> "videos"))

jdbcDF.registerTempTable("videos")

然后执行以下Spark SQL查询:

select
   uploader, count(*) as items
from
   videos_table
where
   publisher_id = 154
group by
   uploader
order by
   items desc

此调用实际上在MySQL服务器上执行以下查询:

SELECT uploader,publisher_id FROM videos WHERE publisher_id = 154

然后将数据加载到Spark群集并执行group-by作为Spark操作。

由于在MySQL服务器上不执行group-by而产生的网络流量过多,因此这种行为存在问题。有没有办法强制DataFrame在MySQL服务器上运行文字查询?

1 个答案:

答案 0 :(得分:2)

嗯,这取决于。 Spark只能通过JDBC推断谓词,因此不可能在数据库端动态执行任意查询。仍然可以使用任何有效的查询作为table参数,这样你就可以这样做:

val tableQuery = 
 """(SELECT uploader, count(*) as items FROM videos GROUP BY uploader) tmp"""

val jdbcDF = sqlContext.load("jdbc", Map(
  "url" -> url,
  "driver" -> driver,
  "dbtable" -> tableQuery
))

如果这还不够,您可以尝试创建自定义data source