You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成SQL含自动换行致脚本报错的技术求助

Sparklyr中compute/pivot_wider生成带换行SQL导致Spark解析失败

环境信息

R version 4.2.2 (2022-10-31)
Platform: x86_64-conda-linux-gnu (64-bit)
Running under: Red Hat Enterprise Linux Server 7.9 (Maipo)
Matrix products: default
BLAS/LAPACK: /data/conda/envs/$USER/r_mamba_dev/lib/libopenblasp-r0.3.21.so

locale:
[1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C             
[3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8   
[5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8  
[7] LC_PAPER=en_US.UTF-8       LC_NAME=C                
[9] LC_ADDRESS=C               LC_TELEPHONE=C           
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C      

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base    

other attached packages:
[1] abfunctions_1.0 arrow_9.0.0     sparklyr_1.8.2  glue_1.6.2    
[5] dbplyr_2.3.3    lubridate_1.9.2 forcats_1.0.0   stringr_1.5.0 
[9] dplyr_1.1.2     purrr_1.0.1     readr_2.1.4     tidyr_1.3.0   
[13] tibble_3.2.0    ggplot2_3.4.2   tidyverse_2.0.0 repr_1.1.4    

loaded via a namespace (and not attached):
[1] pbdZMQ_0.3-8     tidyselect_1.2.0 colorspace_2.0-3 vctrs_0.6.0    
[5] generics_0.1.3   htmltools_0.5.3  yaml_2.3.6       base64enc_0.1-3
[9] utf8_1.2.2       rlang_1.1.0      pillar_1.9.0     withr_2.5.0    
[13] DBI_1.1.3        bit64_4.0.5      uuid_1.1-0       lifecycle_1.0.3
[17] munsell_0.5.0    gtable_0.3.1     evaluate_0.18    tzdb_0.3.0     
[21] fastmap_1.1.0    parallel_4.2.2   fansi_1.0.3      IRdisplay_1.1  
[25] openssl_2.0.6    scales_1.2.1     IRkernel_1.3.1   jsonlite_1.8.4 
[29] config_0.3.1     bit_4.0.5        askpass_1.1      hms_1.1.2      
[33] digest_0.6.30    stringi_1.7.8    grid_4.2.2       cli_3.6.1      
[37] tools_4.2.2      magrittr_2.0.3   crayon_1.5.2     pkgconfig_2.0.3
[41] ellipsis_0.3.2   timechange_0.2.0 assertthat_0.2.1 httr_1.4.4     
[45] rstudioapi_0.14  R6_2.5.1         compiler_4.2.2

问题描述

尝试通过sparklyr查询Hadoop表events并创建临时视图,执行代码:

tokens <- events %>%
    compute("tokens")

期望在Spark中生成名为tokens的临时视图,但触发解析错误:

Error in `db_save_query.DBIConnection()`:
! Can't save query to "tokens".
Caused by error:
! org.apache.spark.sql.catalyst.parser.ParseException:
no viable alternative at input 'CREATE OR REPLACE TEMPORARY VIEW \n"tokens"'(line 2, pos 0)

== SQL ==
CREATE OR REPLACE TEMPORARY VIEW
"tokens" AS SELECT *
^^^
FROM `db`.`events `

仅在使用compute或pivot_wider时出现该问题,直接赋值tokens <- events无异常。问题根源是生成的SQL中自动插入换行,导致Spark无法正确解析。

已尝试无效的方法

  • 更新sparklyr、tidyverse、dplyr、dbplyr至最新版本
  • 重写代码块或改为单行编写

解决方法

方法1:修改dbplyr的SQL格式化规则,移除换行

在执行compute前设置全局选项,将生成的SQL中的换行替换为空格:

options(dbplyr.sql_format = function(sql) gsub("\\n", " ", sql))

之后再执行原compute代码即可。

方法2:使用sparklyr原生函数sdf_register替代compute

sdf_register是sparklyr专门用于注册Spark DataFrame为临时视图的函数,不会生成带换行的SQL:

tokens <- events %>% sdf_register("tokens")

方法3:手动构造SQL语句创建视图

如果上述方法无效,可直接通过原生SQL语句创建临时视图:

# 假设sc是你的Spark连接对象
dbGetQuery(sc, "CREATE OR REPLACE TEMPORARY VIEW tokens AS SELECT * FROM db.events")
# 再将视图转为sparklyr对象
tokens <- tbl(sc, "tokens")

内容的提问来源于stack exchange,提问作者MyNameHere

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 01:25:04