gpt4 book ai didi

r - 使用 sparklyr 将数据从数据库传输到 Spark

转载 作者:行者123 更新时间:2023-12-04 09:07:37 25 4
gpt4 key购买 nike

我在数据库中有一些数据,我想在 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() 看起来有可能,但不清楚如何在这种情况下使用它。

最佳答案

Sparklyr >= 0.6.0

您可以使用 spark_read_jdbc

Sparklyr < 0.6.0

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

  • 确保 Spark 可以访问所需的 JDBC 驱动程序,例如通过将其坐标添加到 spark.jars.packages 。例如使用 PostgreSQL(针对当前版本进行调整),您可以添加:
    spark.jars.packages org.postgresql:postgresql:9.4.1212
    SPARK_HOME/conf/spark-defaults.conf
  • 加载数据并注册为临时 View :
    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)

    您可以使用 options 一次传递多个 environment :
    invoke("options", as.environment(list(
    user="scott", password="tiger", url="jdbc:..."
    )))
  • 使用 dplyr 加载临时 View :
    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?
  • 关于r - 使用 sparklyr 将数据从数据库传输到 Spark,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41966814/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com