如何将Google Sheets数据导入PySpark DataFrame(无需下载或Pandas)
直接将Google Sheets数据导入PySpark DataFrame的方案
关于spark-google-spreadsheets库的可用性
这个Scala库可以在PySpark中使用,但你的代码存在配置和写法问题导致无法运行,具体问题及修正方案如下:
原代码中的问题
- 配置项名称错误:
spark.executorENV.GOOGLE_APPLICATION_CREDENTIALS里的ENV需改为Env(Spark配置项大小写敏感),同时本地路径要补全根路径前缀,比如/home/pathtocreds.json - 未保存SparkSession实例:创建会话后未赋值给
spark变量,后续调用spark.read会报变量未定义错误 - 未指定数据源格式:读取数据时必须明确指定该库的格式类名,不能直接用
load方法传入ID
修正后的代码示例
import pyspark from pyspark.sql import SparkSession # 创建SparkSession并配置依赖与凭证 spark = SparkSession.builder \ .appName('Practise') \ .config("spark.jars.packages", "com.github.potix2:spark-google-spreadsheets_2.12:0.2.0") \ .config("spark.executorEnv.GOOGLE_APPLICATION_CREDENTIALS", "/home/pathtocreds.json") \ .getOrCreate() # 读取Google Sheets数据 df = spark.read \ .format("com.github.potix2.spark.google.spreadsheets") \ .option("spreadsheetId", "你的Google Sheet ID") \ .option("sheetName", "worksheet0") \ .load() df.show()
替代方案(无需第三方库)
如果不想依赖该Scala库,可通过Google Sheets API直接拉取数据,转为RDD后生成DataFrame:
from pyspark.sql import SparkSession from pyspark.sql.types import StructType, StructField, StringType from googleapiclient.discovery import build from oauth2client.service_account import ServiceAccountCredentials # 初始化SparkSession spark = SparkSession.builder.appName('Practise').getOrCreate() # 配置Google Sheets API权限 SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly'] SERVICE_ACCOUNT_FILE = '/home/pathtocreds.json' SPREADSHEET_ID = '你的Google Sheet ID' RANGE_NAME = 'worksheet0!A:Z' credentials = ServiceAccountCredentials.from_json_keyfile_name(SERVICE_ACCOUNT_FILE, SCOPES) service = build('sheets', 'v4', credentials=credentials) # 拉取Sheet数据 sheet = service.spreadsheets() result = sheet.values().get(spreadsheetId=SPREADSHEET_ID, range=RANGE_NAME).execute() values = result.get('values', []) # 定义Schema(假设第一行是表头) schema = StructType([StructField(col, StringType(), True) for col in values[0]]) # 跳过表头生成RDD,转为DataFrame rdd = spark.sparkContext.parallelize(values[1:]) df = spark.createDataFrame(rdd, schema) df.show()
核心注意事项
- 服务账号需获得目标Sheet的访问权限:在Sheet共享设置中添加服务账号的邮箱地址
- 依赖版本需匹配:
spark-google-spreadsheets的Scala版本要与你的Spark版本对应(如Spark 3.x对应2.12版本的库) - 凭证路径需合法:确保Spark集群节点能访问到凭证文件路径,本地模式下路径要绝对正确
内容的提问来源于stack exchange,提问作者Jorge Pacheco
相关产品推荐
相关产品推荐

