提问者:小点点

Spark_Excel跳过Databricks上的前导行-从ADLS第1代读取-需要其他选项或针对我的具体情况的解决方案


我正在尝试从ADLS Gen 1存储文件夹中读取数据,并尝试写入ADLS Gen 2。

我有Databricks代码,可以使用spark_excel从ADLS Gen 1读取Excel文件。

spark_df = spark.read.format("com.crealytics.spark.excel").option("dataAddress", "'Sheet1'!B1:C3").option("header", False).load('/mnt/adls/+path')

我需要的是让数据地址索引B1:C3由一个变量指定。类似于:

var_A = 'B1'
var B = 'C3'
spark_df = spark.read.format("com.crealytics.spark.excel").option("dataAddress", "'Sheet1'!var_A:var_B").option("header", False).load('/mnt/adls/+path')

如果这是不可能的,有没有其他方法从ADLS Gen 1将excel文件读入数据帧?


共1个答案

匿名用户

ADLS Gen1是一项折旧的Azure服务。2024年2月29日,Azure Data Lake Storage Gen1将退役。如果您使用Azure Data Lake Storage Gen1,请确保在该日期之前迁移到Azure Data Lake Storage Gen2。要了解如何操作,请参阅使用Azure门户将Azure数据湖存储从Gen1迁移到Gen2。

一旦您将迁移到ADLS Gen2,就可以使用Python panda模块读取Excel文件,然后将panda数据帧转换为spark数据报。

参考下面的代码:

from datetime import datetime
from pyspark.sql.functions import *
from pyspark.sql.types import *
import pandas as pd

# path to your file
filepath = '/dbfs/FileStore/tables/sample.xlsx'

company_pd_df = pd.read_excel(filepath, sheet_name='Company')

companiesSchema = StructType([
  StructField("CompanyID", IntegerType(), False),
  StructField("CompanyName", StringType(), False),
  StructField("Description", StringType(), False)])

companies_spark_df = spark.createDataFrame(company_pd_df, schema=companiesSchema)

为了更好地理解上述代码的输出,请参阅下面的代码片段。

请注意:

  1. 在将 Pandas DataFrame 转换为 Spark DataFrame 时,我们需要手动定义 Schema,否则转换可能会失败。
  2. 在某些情况下,创建的 Spark 数据帧可能会显示一些虚拟数据或其他不必要的行。在这种情况下,我们可能会过滤掉那些不必要的行。例如companies_Df = companies_df.filter(isnan(“CompaniesID”) != True)