首页 > 解决方案 > 将 sparklyr tbl 用于环境并相应地分配数据?

问题描述

我是新手spark让我们假设我在数据库中有“连接”:

a <- data.frame(a = c(1:3), b = sample(letters, 3), c = rep(1))
b <- data.frame(as = c(1:3), b1 = sample(letters, 3), c2 = rep(2), d = c("KISS", "Scorpion", "Poison"))
c <- data.frame(qn = c(10:20), rj = sample(LETTERS, 11))

我可以使用以下代码访问:

conf <- spark_config()
conf$`sparklyr.shell.driver-memory` <- "16G"
conf$`spark.memory.fraction` <- 0.8
conf$`spark.yarn.executor.memoryOverhead` <- "2g"
sc <- spark_connect(master = "", spark_home = "", config = conf, version = "2.3.1")

我可以通过使用将这些移动到我的环境中

tbs <- src_tbls(sc)

data <- lapply(tbs, function(x) tbl(sc, x))

在我的环境中,我希望有 3 个单独的 data.frames 或 tibbles 作为“a”“b”和“c”。任何人都知道我该如何实现这一目标?我有超过 200 个数据集需要这样做,这就是我使用lapply.

我确实尝试无济于事:

lapply(tbs, function(x) assign(x, tbl(sc,x)))

谢谢

标签: rsparklyr

解决方案


您可以像这样获取一个表(例如“a”):

library(DBI)
a <- dbGetQuery(sc, paste("SELECT * FROM a"))

现在,由于您的 Spark 环境中有很多表,您可以在 an 中执行相同操作lapply,将所有表移动到data.frames 列表中。

table_names <- src_tbls(sc)
data_list <- lapply(table_names,
             function(x) dbGetQuery(sc, paste("SELECT * FROM", x)))
names(data_list) <- table_names

如果你真的,真的,真的想从列表中取出列表元素,你会写attach(data_list). 它被认为是非常糟糕的编程,并且会使进一步的步骤变得相当复杂。


推荐阅读