【问题标题】:Transfer data from database to Spark using sparklyr使用 sparklyr 将数据从数据库传输到 Spark
【发布时间】:2017-06-17 10:25:59
【问题描述】:

我在数据库中有一些数据,我想在 Spark 中使用 sparklyr 处理它。

我可以使用基于 DBI 的包将数据从数据库导入到 R

dbconn <- dbConnect(<some connection args>)
data_in_r <- dbReadTable(dbconn, "a table") 

然后使用将数据从 R 复制到 Spark

sconn <- spark_connect(<some connection args>)
data_ptr <- copy_to(sconn, data_in_r)

对于大型数据集,复制两次速度很慢。

如何将数据直接从数据库复制到 Spark?

sparklyr 有几个 spark_read_*() 用于导入的函数,但与数据库无关。 sdf_import() 看起来有可能,但不清楚如何在这种情况下使用它。

【问题讨论】:

    标签: r apache-spark dataframe sparklyr


    【解决方案1】:

    Sparklyr >= 0.6.0

    您可以使用spark_read_jdbc

    Sparklyr

    我希望有一个更优雅的解决方案,但这里有一个使用低级 API 的最小示例:

    • 确保 Spark 可以访问所需的 JDBC 驱动程序,例如将其坐标添加到 spark.jars.packages。例如使用 PostgreSQL(针对当前版本进行调整),您可以添加:

      spark.jars.packages org.postgresql:postgresql:9.4.1212
      

      SPARK_HOME/conf/spark-defaults.conf

    • 加载数据并注册为临时视图:

      name <- "foo"
      
      spark_session(sc) %>% 
        invoke("read") %>% 
        # JDBC URL and table name
        invoke("option", "url", "jdbc:postgresql://host/database") %>% 
        invoke("option", "dbtable", "table") %>% 
        # Add optional credentials
        invoke("option", "user", "scott") %>%
        invoke("option", "password", "tiger") %>% 
        # Driver class, here for PostgreSQL
        invoke("option", "driver", "org.postgresql.Driver") %>% 
        # Read and register as a temporary view
        invoke("format", "jdbc") %>% 
        invoke("load") %>% 
        # Spark 2.x, registerTempTable in 1.x
        invoke("createOrReplaceTempView", name)
      

      您可以使用environment 一次传递多个options

      invoke("options", as.environment(list(
        user="scott", password="tiger", url="jdbc:..."
      )))
      
    • dplyr加载临时视图:

      dplyr::tbl(sc, name)
      
    • 请务必阅读更多 JDBC 选项,重点关注 partitionColumn*BoundnumPartitions

    • 如需了解更多详情,请参阅 How to use JDBC source to write and read data in (Py)Spark?How to improve performance for slow Spark jobs using DataFrame and JDBC connection?

    【讨论】:

      猜你喜欢
      • 2018-03-30
      • 2016-01-19
      • 1970-01-01
      • 2014-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      相关资源
      最近更新 更多