如何有效地将 MySQL 表读入 Apache Spark/PySpark?
Posted
技术标签:
【中文标题】如何有效地将 MySQL 表读入 Apache Spark/PySpark?【英文标题】:How to read MySQL tables into Apache Spark/PySpark efficiently? 【发布时间】:2015-12-07 10:01:24 【问题描述】:我有一堆 mysql 表,我需要对其执行一些分析。我目前已将表格导出为 CSV 文件并将它们放在 HDFS 上。我现在将每个表从 PySpark 上的 HDFS 读取到不同的 RDD 中以进行分析。
from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.read.format('com.databricks.spark.csv').options(header='true', inferschema='true').load('hdfs://path/to/file.csv')
今天我知道你可以直接从 MySQL 读取表到 Spark。这样做是否有任何性能增强?使用 Spark 处理大型 RDBMS 表时要遵循的标准过程是什么?
【问题讨论】:
【参考方案1】:直接 JDBC 连接为您提供了一些其他选项,例如 partitionColumn、lowerBound、upperBound、numPartitions
df = sqlContext.read.format('jdbc').options(url='jdbc:postgresql:dbserver', dbtable='schema.tablename').load()
或者更重要的功能,您可以根据查询过滤数据。检查这个link
df = sqlContext.read.format('jdbc').options(url='jdbc:postgresql:dbserver', dbtable='(select id,name from emp) as emp').load()
【讨论】:
【参考方案2】:你可以这样做:
props = "driver": "com.vertica.jdbc.Driver"
df = spark.read.jdbc(
url="jdbc:vertica://server:PORT/database?user=someUser&password=Password1",
table="(select * from x where y=0) someAliasThatDontMatter",
properties=props
)
SQL 语句中的别名位允许您过滤、连接等
【讨论】:
以上是关于如何有效地将 MySQL 表读入 Apache Spark/PySpark?的主要内容,如果未能解决你的问题,请参考以下文章
如何有效地将 hadoop 与大型 MySQL 数据库一起使用?
MySQL - 使用 LIMIT 有效地将两个 select 语句组合成一个结果