使用 simba JDBC 从 pyspark 连接到 BigQuery
Connect to BigQuery from pyspark using simba JDBC
更新问题6/21
关于辛巴的背景:
Simba Google BigQuery JDBC 连接器在名为 SimbaBigQueryJDBC42-[Version].zip 的 ZIP 存档中交付,其中 [Version] 是连接器的版本号。
存档包含支持存档名称中指示的 JDBC API 版本的连接器,以及发行说明和第三方许可信息。
我正在尝试使用 simba jdbc 从 pyspark (docker) 连接到 BigQuery,但没有成功。我在这里查看了很多帖子,但找不到线索
我刚从 VC 在 spark docker image
中提交的代码
import pyspark
from pyspark import SparkConf
from pyspark.sql import SQLContext, SparkSession
import os
from glob import glob
my_jar = glob('/root/Downloads/BigQuery/simba_jdbc_1.2.4.1007/*.jar')
my_jar_str = ','.join(my_jar)
print(my_jar_str)
sc_conf = SparkConf()
sc_conf.setAppName("testApp")
sc_conf.setMaster('local[*]')
sc_conf.set("spark.jars", my_jar_str)
sc = pyspark.SparkContext(conf=sc_conf)
spark = SparkSession \
.builder \
.master('local') \
.appName('spark-read-from-bigquery') \
.config("spark.executor.extraClassPath",my_jar_str) \
.config("spark.driver.extraClassPath",my_jar_str) \
.config("spark.jars", my_jar_str)\
.getOrCreate()
myJDBC = '''
jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType={OAuthType};ProjectId={ProjectId};OAuthServiceAcctEmail={OAuthServiceAcctEmail};OAuthPvtKeyPath={OAuthPvtKeyPath};
'''.format(OAuthType=0,
ProjectId='ProjectId',
OAuthServiceAcctEmail="etl@dProjectId.iam.gserviceaccount.com",
OAuthPvtKeyPath="/workspaces/code/secrets/etl.json")
pgDF = spark.read \
.format("jdbc") \
.option("url", myJDBC) \
.option("driver", "com.simba.googlebigquery.jdbc42.Driver") \
.option("dbtable", my_query) \
.load()
我遇到错误:
File "/opt/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 328, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o79.load.
: java.lang.NullPointerException
at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:71)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation$.getSchema(JDBCRelation.scala:210)
at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:35)
at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:318)
at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:223)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:211)
是缺少 jar 还是逻辑错误?
请提供任何线索
对于任何可能有相同想法的人。我刚刚发现 SIMBA 不支持 spark,但我必须按照 https://github.com/GoogleCloudDataproc/spark-bigquery-connector.
中的步骤操作
我不使用 Dataproc 而是使用独立 spark 的未决问题(截至 6 月 23 日),所以我需要弄清楚如何收集 consistent支持罐子
如果 ODBC 也适用于您,也许这会有所帮助。
首先,从 here:
下载并配置 ODBC 驱动程序
下一步 - 使用这样的连接(注意 IgnoreTransactions 参数):
import pyodbc
import pandas as pd
conn = pyodbc.connect(r'Driver={Simba ODBC Driver for Google BigQuery};OAuthMechanism=0;Catalog=<projectID>;KeyFilePath=<path to json credentials>;Email=<email of service account>;IgnoreTransactions=1')
qry = 'select * from <path to your table>'
data = pd.read_sql(qry,conn)
更新问题6/21
关于辛巴的背景: Simba Google BigQuery JDBC 连接器在名为 SimbaBigQueryJDBC42-[Version].zip 的 ZIP 存档中交付,其中 [Version] 是连接器的版本号。 存档包含支持存档名称中指示的 JDBC API 版本的连接器,以及发行说明和第三方许可信息。
我正在尝试使用 simba jdbc 从 pyspark (docker) 连接到 BigQuery,但没有成功。我在这里查看了很多帖子,但找不到线索
我刚从 VC 在 spark docker image
中提交的代码import pyspark
from pyspark import SparkConf
from pyspark.sql import SQLContext, SparkSession
import os
from glob import glob
my_jar = glob('/root/Downloads/BigQuery/simba_jdbc_1.2.4.1007/*.jar')
my_jar_str = ','.join(my_jar)
print(my_jar_str)
sc_conf = SparkConf()
sc_conf.setAppName("testApp")
sc_conf.setMaster('local[*]')
sc_conf.set("spark.jars", my_jar_str)
sc = pyspark.SparkContext(conf=sc_conf)
spark = SparkSession \
.builder \
.master('local') \
.appName('spark-read-from-bigquery') \
.config("spark.executor.extraClassPath",my_jar_str) \
.config("spark.driver.extraClassPath",my_jar_str) \
.config("spark.jars", my_jar_str)\
.getOrCreate()
myJDBC = '''
jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;OAuthType={OAuthType};ProjectId={ProjectId};OAuthServiceAcctEmail={OAuthServiceAcctEmail};OAuthPvtKeyPath={OAuthPvtKeyPath};
'''.format(OAuthType=0,
ProjectId='ProjectId',
OAuthServiceAcctEmail="etl@dProjectId.iam.gserviceaccount.com",
OAuthPvtKeyPath="/workspaces/code/secrets/etl.json")
pgDF = spark.read \
.format("jdbc") \
.option("url", myJDBC) \
.option("driver", "com.simba.googlebigquery.jdbc42.Driver") \
.option("dbtable", my_query) \
.load()
我遇到错误:
File "/opt/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py", line 328, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o79.load.
: java.lang.NullPointerException
at org.apache.spark.sql.execution.datasources.jdbc.JDBCRDD$.resolveTable(JDBCRDD.scala:71)
at org.apache.spark.sql.execution.datasources.jdbc.JDBCRelation$.getSchema(JDBCRelation.scala:210)
at org.apache.spark.sql.execution.datasources.jdbc.JdbcRelationProvider.createRelation(JdbcRelationProvider.scala:35)
at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:318)
at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:223)
at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:211)
是缺少 jar 还是逻辑错误? 请提供任何线索
对于任何可能有相同想法的人。我刚刚发现 SIMBA 不支持 spark,但我必须按照 https://github.com/GoogleCloudDataproc/spark-bigquery-connector.
中的步骤操作我不使用 Dataproc 而是使用独立 spark 的未决问题(截至 6 月 23 日),所以我需要弄清楚如何收集 consistent支持罐子
如果 ODBC 也适用于您,也许这会有所帮助。 首先,从 here:
下载并配置 ODBC 驱动程序下一步 - 使用这样的连接(注意 IgnoreTransactions 参数):
import pyodbc
import pandas as pd
conn = pyodbc.connect(r'Driver={Simba ODBC Driver for Google BigQuery};OAuthMechanism=0;Catalog=<projectID>;KeyFilePath=<path to json credentials>;Email=<email of service account>;IgnoreTransactions=1')
qry = 'select * from <path to your table>'
data = pd.read_sql(qry,conn)