在R中使用BigQuery数据集执行线性回归报错,求解决方案
解决lm()函数报错:"'data' must be a data.frame, environment, or list"
错误原因
lm()函数无法直接识别远程BigQuery数据集的字符串路径,它要求data参数必须是本地加载的data.frame、环境或列表,你传入的"MyProjectID.MyDataset"是字符串格式,不符合参数要求。
解决方案
方案1:将目标数据下载到本地(适合小数据集)
先通过bigrquery把BigQuery中需要的数据下载到本地生成data.frame,再用这个本地数据集训练模型:
# 1. 定义SQL查询(建议只选择回归需要的列,减少数据量) sql <- "SELECT event_n, geo_country FROM `MyProjectID.MyDataset`" # 2. 下载数据到本地data.frame(二选一即可) # 方法A:用bq_project_query + bq_table_download tb <- bigrquery::bq_project_query("MyProjectID", sql) df <- bq_table_download(tb) # 方法B:用DBI连接查询 df <- dbGetQuery(con, sql) # 3. 训练线性回归模型 model_fit <- lm(event_n ~ geo_country, data = df)
方案2:在BigQuery云端执行回归(适合大数据集)
如果数据量过大,不适合全量下载到本地,可以使用BigQuery的ML功能直接在云端训练模型:
# 1. 定义BigQuery ML训练语句 sql_train <- " CREATE OR REPLACE MODEL `MyProjectID.MyDataset.linear_reg_model` OPTIONS(model_type='linear_reg') AS SELECT event_n, geo_country FROM `MyProjectID.MyDataset` " # 2. 执行云端模型训练 bigrquery::bq_project_query("MyProjectID", sql_train) # 3. 查询模型评估结果 sql_eval <- "SELECT * FROM ML.EVALUATE(MODEL `MyProjectID.MyDataset.linear_reg_model`)" eval_results <- bq_table_download(bq_project_query("MyProjectID", sql_eval)) print(eval_results)
额外注意
你原始代码中存在顺序错误:test <- dbGetQuery(con, sql, ...)在sql定义之前执行,会导致sql未定义的报错,需要调整顺序:
# 先定义SQL sql <- "SELECT * FROM `MyProjectID.MyDataset`" # 再执行查询 test <- dbGetQuery(con, sql, n = 10000, max_pages = Inf) # 之后可以用test作为data参数训练模型 model_fit <- lm(event_n ~ geo_country, data = test)
内容的提问来源于stack exchange,提问作者beth_9
相关产品推荐
相关产品推荐

