从 Azure Databricks 读取 Excel 文件

Reading Excel file from Azure Databricks

我正在尝试从 Azure Databricks 准备 Excel 文件 (.xlsx),文件在 ADLS Gen 2 中。

示例:

srcPathforParquet = "wasbs://hyxxxx@xxxxdatalakedev.blob.core.windows.net//1_Raw//abc.parquet"
srcPathforExcel = "wasbs://hyxxxx@xxxxdatalakedev.blob.core.windows.net//1_Raw//src.xlsx"

从路径读取镶木地板文件工作正常。

srcparquetDF = spark.read.parquet(srcPathforParquet )

正在从路径中读取 excel 文件抛出错误:没有那个文件或目录

srcexcelDF = pd.read_excel(srcPathforExcel , keep_default_na=False, na_values=[''])

根据我的报告,无法使用存储帐户访问密钥直接访问来自 ADLS gen2 的 excel 文件。当我尝试通过 ADLS gen2 URL 读取 excel 文件时,我收到与 FileNotFoundError: [Errno 2] No such file or directory: 'abfss://filesystem@chepragen2.dfs.core.windows.net/flightdata/drivers.xlsx'.

相同的错误消息

从 Azure Databricks 读取 Excel 文件 (.xlsx) 的步骤,文件在 ADLS Gen 2 中:

步骤 1: 装载 ADLS Gen2 存储帐户。

configs = {"fs.azure.account.auth.type": "OAuth",
           "fs.azure.account.oauth.provider.type": "org.apache.hadoop.fs.azurebfs.oauth2.ClientCredsTokenProvider",
           "fs.azure.account.oauth2.client.id": "<application-id>",
           "fs.azure.account.oauth2.client.secret": dbutils.secrets.get(scope="<scope-name>",key="<service-credential-key-name>"),
           "fs.azure.account.oauth2.client.endpoint": "https://login.microsoftonline.com/<directory-id>/oauth2/token"}

# Optionally, you can add <directory-name> to the source URI of your mount point.
dbutils.fs.mount(
  source = "abfss://<file-system-name>@<storage-account-name>.dfs.core.windows.net/",
  mount_point = "/mnt/<mount-name>",
  extra_configs = configs)

步骤 2: 使用装载路径读取 excel 文件。

参考: Azure Databricks - Azure Data Lake Storage Gen2

方法pandas.read_excel不支持使用wasbsabfss方案URL访问文件。详情请参考here

因此,如果您想使用 pandas 访问文件,我建议您创建一个 sas 令牌并使用带有 sas 令牌的 https 方案来访问文件或将文件下载为流然后读取它与 pandas。同时,您还将存储帐户挂载为文件系统,然后按照@CHEEKATLAPRADEEP-MSFT 所述访问文件。

例如

  • 使用 sas 令牌访问
  1. 通过 Azure 门户创建 sas 令牌

  2. 代码

pdf=pd.read_excel('https://<account name>.dfs.core.windows.net/<file system>/<path>?<sas token>')
print(pdf)

  • 将文件下载为流并读取文件
  1. 在数据块中使用 pip 安装包 azure-storage-file-datalakexlrd

  2. 代码

import io

import pandas as pd
from azure.storage.filedatalake import BlobServiceClient
from azure.storage.filedatalake import DataLakeServiceClient

blob_service_client = DataLakeServiceClient(account_url='https://<account name>.dfs.core.windows.net/', credential='<account key>')

file_client = blob_service_client.get_file_client(file_system='test', file_path='data/sample.xlsx')
with io.BytesIO() as f:
  downloader =file_client.download_file()
  b=downloader.readinto(f)
  print(b)
  df=pd.read_excel(f)
  print(df)

此外我们还可以使用pyspark读取excel文件。但是我们需要在我们的环境中添加 jar com.crealytics:spark-excel 。详情请参考here and here

例如

  1. 通过 maven 添加包 com.crealytics:spark-excel_2.12:0.13.1。此外,请注意,如果您使用 scala 2.11,请添加包 com.crealytics:spark-excel_2.11:0.13.1

  2. 代码

spark._jsc.hadoopConfiguration().set("fs.azure.account.key.<account name>.dfs.core.windows.net",'<account key>')

print("use spark")
df=sqlContext.read.format("com.crealytics.spark.excel") \
        .option("header", "true") \
        .load('abfss://test@testadls05.dfs.core.windows.net/data/sample.xlsx')

df.show()

根据我的经验,以下是对我从数据块中的 ADLS2 读取 excel 文件有用的基本步骤:

  • 在我的 Databricks 集群上安装了以下库

com.crealytics:spark-excel_2.12:0.13.6

  • 添加了以下 spark 配置

spark.conf.set(adlsAccountKeyName,adlsAccountKeyValue)

adlsAccountKeyName --> fs.azure.account.key.YOUR_ADLS_ACCOUNT_NAME>.blob.core.windows.net adlsAccountKeyValue --> 您的 adls 帐户的 sas 密钥

  • 使用以下代码从 ADLS.
  • 中的 excel 文件中获取 spark 数据帧
myDataFrame = (spark.read.format("com.crealytics.spark.excel")
            .option("dataAddress", "'Sheetname'!")
          .option("header", "true")
          .option("treatEmptyValuesAsNulls", "true")
          .option("inferSchema", "false") 
          .option("addColorColumns", "false") 
          .option("startColumn", 0) 
          .option("endColumn", 99)  
          .option("timestampFormat", "dd-MM-yyyy HH:mm:ss")
          .load(FullFilePathExcel)
          )