如何有效地将 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?的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中有效地将数据插入 MySQL 中的多个表中

如何有效地将 hadoop 与大型 MySQL 数据库一起使用?

如何有效地将数据附加到 C 中的 HDF5 表?

MySQL - 使用 LIMIT 有效地将两个 select 语句组合成一个结果

如何有效地将大型 .tsv 文件上传到 pyspark 中具有拆分列的 Hive 表?

如何有效地将巨大的 sql 表加载到 asp.net 应用程序内存中以进一步迭代它?