我已经注册了一个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服务器上运行文字查询?
答案 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。