生成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
相关产品推荐
相关产品推荐

