从Azure Databricks读取Excel文件

问题描述

正在尝试从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'相同的错误消息。

enter image description here

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

第一步:挂载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)

第二步:使用安装路径读取excel文件。

enter image description here

参考: Azure Databricks - Azure Data Lake Storage Gen2

,

方法pandas.read_excel不支持使用wasbsabfss方案URL来访问文件。有关更多详细信息,请参阅here

因此,如果要使用pandas访问文件,建议您创建一个sas令牌,并将https方案与sas令牌一起使用,以访问文件或将其下载为流,然后使用pandas进行读取。同时,您还将存储帐户安装为文件系统,然后按照@ CHEEKATLAPRADEEP-MSFT的说明访问文件。

例如

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

  2. 代码

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

enter image description here

  • 将文件下载为流并读取文件
  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)

enter image description here

此外,我们还可以使用pyspark读取excel文件。但是我们需要在我们的环境中添加jar com.crealytics:spark-excel。有关更多详细信息,请参阅herehere

例如

  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()

enter image description here

,

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

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

com.crealytics:spark-excel_2.12:0.13.6

  • 添加了以下火花配置

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)
          )