将大型 csv 加载到 mysql 等 RDB 的推荐方法
Posted
技术标签:
【中文标题】将大型 csv 加载到 mysql 等 RDB 的推荐方法【英文标题】:Recommended ways to load large csv to RDB like mysql 【发布时间】:2016-01-18 07:29:15 【问题描述】:目标:构建一个小型 ETL 框架以获取巨大的 CSV 并将其转储到 RDB(例如 mysql)中。
我们目前正在考虑的方法是使用 spark 将 csv 加载到数据帧中并将其持久化,然后使用 apache scoop 之类的框架并将其加载到 mySQL 中。
需要关于坚持哪种格式和方法本身的建议。
编辑: CSV 将有大约 5000 万行和 50-100 列。 由于我们的任务在转储到 RDB 之前涉及大量转换,因此我们认为使用 spark 是一个好主意。
【问题讨论】:
更多信息会有所帮助。文件大小,为什么要使用 Spark?是否涉及任何处理?如果是 CSV,那么为什么不使用直接 DB 加载器在 DB 中转储/导入数据? 我对多个 TB 大小的 CSV 文件做同样的事情。加上 CSV 中的数据需要解析/转换。使用 Spark 是否有意义或其他工具更适合? 【参考方案1】:Spark SQL 支持直接写入 RDB。您可以将巨大的 CSV 加载为 DataFrame,对其进行转换,然后调用下面的 API 将其保存到数据库。 请参考以下API:
org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils
def saveTable(df: DataFrame,
url: String,
table: String,
properties: Properties): Unit
Saves the RDD to the database in a single transaction.
示例代码:
val url: String = "jdbc:oracle:thin:@your_domain:1521/dbname"
val driver: String = "oracle.jdbc.OracleDriver"
val props = new java.util.Properties()
props.setProperty("user", "username")
props.setProperty("password", "userpassword")
org.apache.spark.sql.execution.datasources.jdbc.JdbcUtils.saveTable(dataFrame, url, "table_name", props)
【讨论】:
以上是关于将大型 csv 加载到 mysql 等 RDB 的推荐方法的主要内容,如果未能解决你的问题,请参考以下文章
使用 map reduce 将数据从大型 csv 文件加载到 sql server