当前位置: 首页 > 知识库问答 >
问题:

如何在AWS glue中用雪花JDBC连接驱动程序运行pySpark

段干祺
2023-03-14
I am trying to run the below code in AWS glue:
import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
from py4j.java_gateway import java_import
SNOWFLAKE_SOURCE_NAME = "net.snowflake.spark.snowflake"

## @params: [JOB_NAME, URL, ACCOUNT, WAREHOUSE, DB, SCHEMA, USERNAME, PASSWORD]
args = getResolvedOptions(sys.argv, ['JOB_NAME', 'URL', 'ACCOUNT', 'WAREHOUSE', 'DB', 'SCHEMA', 'USERNAME', 'PASSWORD'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
java_import(spark._jvm, "net.snowflake.spark.snowflake")

## uj = sc._jvm.net.snowflake.spark.snowflake
spark._jvm.net.snowflake.spark.snowflake.SnowflakeConnectorUtils.enablePushdownSession(spark._jvm.org.apache.spark.sql.SparkSession.builder().getOrCreate())

options = {
"sfURL" : args['URL'],
"sfAccount" : args['ACCOUNT'],
"sfUser" : args['USERNAME'],
"sfPassword" : args['PASSWORD'],
"sfDatabase" : args['DB'],
"sfSchema" : args['SCHEMA'],
"sfWarehouse" : args['WAREHOUSE'],
}

df = spark.read \
  .format("snowflake") \
  .options(**options) \
  .option("dbtable", "STORE") \
  .load()

display(df)

## Perform any kind of transformations on your data and save as a new Data Frame: “df1”
##df1 = [Insert any filter, transformation, etc]

## Write the Data Frame contents back to Snowflake in a new table
##df1.write.format(SNOWFLAKE_SOURCE_NAME).options(**sfOptions).option("dbtable", "[new_table_name]").mode("overwrite").save()
job.commit()

并得到一个错误。

Traceback (most recent call last): File "/tmp/spark_snowflake", line 35, in <module> 
.option("dbtable", "STORE") \ File 
"/opt/amazon/spark/python/lib/pyspark.zip/pyspark/sql/readwriter.py", line 172, in load return 
self._df(self._jreader.load()) File "/opt/amazon/spark/python/lib/py4j-0.10.7- 

src.zip/py4j/java_gateway.py“,第1257行,在调用应答中,self.gateway_client,self.target_id,self.name)文件”/opt/amazon/spark/python/lib/pyspark.zip/pyspark/sql/utils.py“,第63行,在deco返回f(*a,**kw)文件”/opt/amazon/spark/python/lib/py4j/protocol.py“,第328行,在get_return_value格式(target_id,:java.lang.ClassNotFoundException:未能找到数据源:Snowflake。请在http://spark.apache.org/third-party-projects.html找到包,地址为org.apache.spark.sql.execution.datasources.datasource$.lookupdatasource(datasource.scala:657),地址为org.apache.spark.sql.dataframereader.load(dataframereader.scala:194),地址为sun.reflect.nativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)位于sun.reflect.DelegatingMethodAccessorImpL.invoke(DelegatingMethodAccessorImpl.java:43),java.lang.reflect.method.invoke(method.java:498),py4j.reflection.methodInvoker.invoke(methodInvoker.java:244),py4j.reflection.methodInvoker.java:244),py4j.reflection.reflection.reflectionEngine.invoke(reflectionEngine.invoke(reflectionEngine..thread.run(thread.java:748)由:java.lang.ClassNotFoundException:snowflake.DefaultSource在java.net.urlClassLoader.FindClass(URLClassLoader.java:382)在java.lang.ClassLoader.LoadClass(ClassLoader.java:418)在sun.misc.launcher$AppClassLoader.LoadClass(Launcher.java:352)在java.lang.ClassLoader.LoadClass(Launcher.java:351)

org.apache.spark.sql.execution.datasources.datasource$$$anonfun$20$$anonfun$apply$12.apply(datasource.scal A:634)at

共有1个答案

鲜于璞瑜
2023-03-14

错误消息表示“java.lang.ClassNotFoundException:未能找到数据源:Snowflake”。当你创建一个工作时,你是否使用了合适的罐子并将其传递给胶水?这里的一些例子

在PySpark中运行自定义Java类

 类似资料:
  • 问题内容: 我目前正在为大学的一个班级做项目。我正在学习有关连接和操作数据库的信息,我们正在使用Microsoft .accdb文件。 这是我到目前为止所拥有的。 当寻找“ sun.jdbc.odbc.JdbcOdbcDriver”时,我得到以下输出。 似乎很容易解决。看来我想念司机或类似的东西。但是,我很难找到解决方法。JDK随附驱动程序吗?我需要单独下载吗?是否取决于我的操作系统?(Mac O

  • 使用此代码: 连接是池连接吗?我使用的是基本的java DriverManager,但在Mark的世界中,它得到的是一个雪花驱动程序,它将连接池化。所以 正在获取池连接。对吧?

  • 我试图建立一个SSL连接到赛贝斯ASE 15.7使用JDBC驱动程序没有运气。我尝试了以下选项: > 使用JTDS 1.25驱动程序(jtds-1.2.5.jar) 使用以下连接字符串: 我收到 使用jconnect4(jconn4.jar) 使用以下连接字符串: jdbc:sybase:Tds:host:port/dbname?ENABLE_SSL=true 我得到了

  • 问题内容: 我想从MySQL中的表中获取数据并在TextView中显示它,但是当我尝试与数据库连接时遇到了一些问题。 我正在使用Eclipse for Android,当我尝试从Java Project中的MySQL获取数据时,它可以工作,但是当我使用Android Project时,则无法工作。 有谁知道如何使用MySQL JDBC驱动程序将MySQL与Android Project连接? 或者

  • 我目前正在尝试使用C3P0作为我的JDBC连接池来设置Apache Ignite,但是我注意到由于Ignite驱动程序不支持事务,C3P0是不可用的。 有没有人幸运地用Ignite驱动程序获得了JDBC连接池?建议? 因此,如果我想建立一个JDBC连接池,我需要一个C3P0的替代方案;有什么建议吗?

  • 问题内容: 在进行简单的JDBC连接时,所有资源都提供相同的代码, 但是我们实际上与“ Class.forName(driver)”无关。我们没有将其存储在任何地方。它的用途是什么,因为我们与Class.forName(driver)的返回无关。 问题答案: 尝试加载命名的类。在早期的JDBC版本中,这是必需的,因为该类要求以这种方式加载该类。多年以来都不需要这样做。 忽略通话,不会发生任何不良情