代码之家  ›  专栏  ›  技术社区  ›  Kasia Kulma

R: 连接到Teradata时,JDBC()找不到Java驱动程序路径

  •  3
  • Kasia Kulma  · 技术社区  · 6 年前

    我试图通过RStudio连接到Teradata,但由于某些原因,JDBC函数在识别Java驱动程序所在的路径时遇到问题。请参见以下代码:

    library(RODBC)
    library(RJDBC)
    library(rJava)
    
    # both Java drivers definitely exist 
    file.exists('/Users/KULMAK/Documents/TeraJDBC__indep_indep.16.10.00.03/tdgssconfig.jar')
    [1] TRUE
    
    file.exists('/Users/KULMAK/Documents/TeraJDBC__indep_indep.16.10.00.03/terajdbc4.jar')
    [1] TRUE
    

    但当我在JDBC调用中粘贴这些路径时。。。

    # allow more elaborated error messages to appear 
    .jclassLoader()$setDebug(1L) 
    
    drv = JDBC("com.teradata.jdbc.TeraDriver","/Users/KULMAK/Documents/TeraJDBC__indep_indep.16.10.00.03/tdgssconfig.jar;/Users/KULMAK/Documents/TeraJDBC__indep_indep.16.10.00.03/terajdbc4.jar")
    

    。。。我得到以下错误:

    RJavaClassLoader:已添加 '/Users/KULMAK/Documents/TeraJDBC\uu indep\u indep。2003年10月16日/tdgssconfig。罐子/用户/KULMAK/Documents/TeraJDBC\uu indep\u indep。16.10.00.03/terajdbc4。罐子' 到URL类路径加载器警告:路径 ' /用户/KULMAK/Documents/TeraJDBC\uu indep\u indep。2003年10月16日/tdgssconfig。罐子/用户/KULMAK/Documents/TeraJDBC\uu indep\u indep。16.10.00.03/terajdbc4。罐子' 不存在,将不会添加到内部类路径! RJavaClassLoader:已添加 “/Library/Frameworks/R.framework/Versions/3.4/Resources/Library/RJDBC/java/RJDBC。罐子' 到URL类路径加载器RJavaClassLoader:添加Java存档 文件 “/Library/Frameworks/R.framework/Versions/3.4/Resources/Library/RJDBC/java/RJDBC。罐子' 到内部类路径 RJavaClassLoader@3d4eac69.findClass(com.teradata.jdbc.TeraDriver) -URL加载程序找不到它:java。lang.ClassNotFoundException:com。teradata。jdbc。TeraDriver公司 RJavaClassLoader。findClass(“com.teradata.jdbc.TeraDriver”) -正在尝试类路径“/库/框架/R.framework/版本/3.4/资源/库/rJava/java” 目录,可以获取 “/Library/Frameworks/R.framework/Versions/3.4/Resources/Library/rJava/java/com/teradata/jdbc/TeraDriver。类'? 否 -正在尝试类路径“/Library/Frameworks/R.framework/Versions/3.4/Resources/Library/RJDBC/java/RJDBC.jar” JAR文件,是否可以获取“com/teradata/jdbc/TeraDriver”?否

    ClassNotFoundException类 中出错。jfindClass(as.character(driverClass)[1]):找不到类

    在R中运行相同的代码,而不是在RStudio中运行,会返回相同的错误。

    此外,重新安装RJDBC包(如建议 here )没有解决问题。

    有人能解释为什么会这样吗?谢谢你的帮助。

    以下是我的会话信息:

    > sessionInfo()
    R version 3.4.1 (2017-06-30)
    Platform: x86_64-apple-darwin15.6.0 (64-bit)
    Running under: macOS High Sierra 10.13.3
    
    Matrix products: default
    BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
    LAPACK: /Library/Frameworks/R.framework/Versions/3.4/Resources/lib/libRlapack.dylib
    
    locale:
    [1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     
    
    other attached packages:
    [1] devtools_1.13.4 RJDBC_0.2-7     rJava_0.9-9     DBI_0.8         RODBC_1.3-15   
    [6] dplyr_0.7.4     readr_1.1.1    
    
    loaded via a namespace (and not attached):
     [1] Rcpp_0.12.15     bindr_0.1        magrittr_1.5     hms_0.3          R6_2.2.2        
     [6] rlang_0.1.6      httr_1.3.1       tools_3.4.1      git2r_0.19.0     withr_2.1.1.9000
    [11] yaml_2.1.16      assertthat_0.2.0 digest_0.6.15    tibble_1.4.2     bindrcpp_0.2    
    [16] curl_3.0         memoise_1.1.0    glue_1.2.0       compiler_3.4.1   pillar_1.1.0    
    [21] pkgconfig_2.0.1
    
    2 回复  |  直到 6 年前
        1
  •  5
  •   Mark Rotteveel    6 年前

    这是路径中的一个错误-您无意中将两条路径粘贴在一起(请注意路径之间的分号)。你可能是有意的

    drv <- JDBC("com.teradata.jdbc.TeraDriver",
      c("/Users/KULMAK/Documents/TeraJDBC__indep_indep.16.10.00.03/tdgssconfig.jar",
        "/Users/KULMAK/Documents/TeraJDBC__indep_indep.16.10.00.03/terajdbc4.jar"))
    

    请注意,只需使用

    drv <- JDBC("com.teradata.jdbc.TeraDriver", Sys.glob("/Users/KULMAK/Documents/TeraJDBC__indep_indep.16.10.00.03/*.jar"))
    
        2
  •  1
  •   Ludwig    5 年前

    这对我有用。只需确保两个JAR都位于引用的目录中。

    library(RJDBC)
    drv <- RJDBC::JDBC(driverClass = "com.teradata.jdbc.TeraDriver", classPath =  Sys.glob("~/drivers/teradata/*"))
    conn <- dbConnect(drv,'jdbc:teradata://<server>/<db>',"un","pw")
    result.df<- dbGetQuery(conn,"select * from table")