For 循环从 R 中的函数设置周数

Posted

技术标签:

【中文标题】For 循环从 R 中的函数设置周数【英文标题】:For Loop For Set Weeks from Function in R 【发布时间】:2022-01-18 19:52:57 【问题描述】:

我正在使用 Databricks 从 Snowflake 中检索数据。目前在 R 中使用的函数按原样工作。但是,我的数据集非常大(100B 行),并且想以 for 循环的形式调用我的数据集以降低内存。如何根据 for 循环检索如下数据集?

## Call Libraries to retrieve dataset from Snowflake
library(rJava)
library(RJDBC)
library(DBI)

## Connect to Snowflake

jdbcDriver <- JDBC(driverClass="com.snowflake.client.jdbc.SnowflakeDriver",
                  classPath="dbfs:/FileStore/jars/ced63da8_4613_4687_9051_1ea61dbf3b76- 
snowflake_jdbc_3_12_12-30836.jar")

jdbcConnection <- dbConnect(jdbcDriver,
                           "jdbc:snowflake://xxx.us-east-1.snowflakecomputing.com/",
                           "xxxx",
                           dbutils.secrets.get(scope="xxx", key="xxx"))

下面是我希望实现 for 循环以检索每周数据而不是整个数据集并将结果彼此附加的地方。目标是根据这些结果在 Snowflake 中创建一个新表,但很好奇如何首先创建 for 循环。

## Run SQL Query to retrieve dataset from Snowflake in the form of an R function
sq <- function(query)
 dbGetQuery(jdbcConnection, knitr::knit_expand(text=query))



show1 <- function(a) 
  sq(
    paste(
"  
select
data_source,
media_id, 
sum(activity_count)
from", a, "
where START_DATE_EST between '2019-11-01' and '2021-11-14' "
)

)
activity_by_month<-show1("SCHEMA.TABLE_NAME")

如果我要运行它,这将需要几天的时间,并且由于数据量的原因它会超时。我想以 for 循环的格式运行此函数,在该循环中我按周收集数据并将结果附加在一起。以前有人这样做过吗?

理想的方法是这样运行:

start_date_vector <- c('2019-11-01', '2019-11-09', etc.)
end_date_vector <- c('2019-11-08', '2019-11-16', etc.)

for(i in start_date_vector) 
  for(j in end_date_vector) 
    show1

rbind(show1)

上面的 SQL 查询看起来像这样:

where START_DATE_EST between", start_date_vector," and",end_date_vector "

然后编写一个 SQL 查询,将结果合并在一起并保存一个表。

【问题讨论】:

看起来该模式正在将数据移出 Snowflake,在外部处理并将其保存回来。根据具体要求,可能值得考虑替代方法(即Snowpark 和Snowpark Overview),无需往返即可处理数据。 谢谢,是的,这就是概念!数据集太大而无法一次运行,因此我想将其拆分,以免 Databricks/Snowflake 内存不足。一些同事建议我做一个 for 循环。我也会研究这个解决方案! 【参考方案1】:

鉴于数据集很大,与通过 JDBC 检索数据以在 Spark (Databricks) 环境中使用相比,可能有几个更好、更快的选项,您可能希望在提取数据后并行进一步处理.

Snowflake Spark 连接器 该连接器可用,preloaded in Databricks 因此您应该能够在您的环境中使用它。它专门设计用于处理 Snowflake 和 Spark 集群之间的直接大规模数据传输,并在后台使用批量数据传输技术。它可以用于retrieve data from Snowflake into a Spark dataframe,然后可以在需要时持久化到存储中。

复制到分区的 PARQUET 文件 Snowflakes COPY INTO 命令支持分区文件卸载数据到 PARQUET 文件。您可以指定要用于对文件进行分区的列/表达式,类似于您在 R 中使用的嵌套 for 循环方法,例如 partition by ('date=' || to_varchar(START_DATE_EST), 'YYYY-MM') || '/week=' || to_varchar(week(START_DATE_EST))).

您可以将文件卸载到内部 Snowflake 阶段,然后将 GET 文件从那里卸载到本地 R 环境。如果您有权访问云存储(例如 AWS S3 存储桶),您可以通过 Snowflake External 阶段在那里卸载,该阶段也可以通过具有正确权限的 Spark 环境直接访问。 JDBC 和 ODBC 驱动程序支持 COPY INTO 和 GET 命令,因此您可以通过编程方式形成所需的 SQL 代码并从 R 中执行。

【讨论】:

以上是关于For 循环从 R 中的函数设置周数的主要内容,如果未能解决你的问题,请参考以下文章

R中的for循环与while循环

Google Bigquery Legacy SQL - 如何将周数设置为星期一?

for循环R语言seq函数与Python语言range函数的区别

R循环函数(forwhilebreaknext)

将数组中的所有项目设置为没有for循环c ++的数字[重复]

您如何设置一个 for 循环,该循环基本上以循环模式运行一定数量的数字?例如,如何从 123 到 231 到 312