从 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 文件。
方法pandas.read_excel
不支持使用wasbs
或abfss
方案URL访问文件。详情请参考here
因此,如果您想使用 pandas 访问文件,我建议您创建一个 sas 令牌并使用带有 sas 令牌的 https
方案来访问文件或将文件下载为流然后读取它与 pandas。同时,您还将存储帐户挂载为文件系统,然后按照@CHEEKATLAPRADEEP-MSFT 所述访问文件。
例如
- 使用 sas 令牌访问
通过 Azure 门户创建 sas 令牌
代码
pdf=pd.read_excel('https://<account name>.dfs.core.windows.net/<file system>/<path>?<sas token>')
print(pdf)
- 将文件下载为流并读取文件
在数据块中使用 pip 安装包 azure-storage-file-datalake
和 xlrd
代码
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
例如
通过 maven 添加包 com.crealytics:spark-excel_2.12:0.13.1
。此外,请注意,如果您使用 scala 2.11,请添加包 com.crealytics:spark-excel_2.11:0.13.1
代码
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)
)
我正在尝试从 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 文件。
方法pandas.read_excel
不支持使用wasbs
或abfss
方案URL访问文件。详情请参考here
因此,如果您想使用 pandas 访问文件,我建议您创建一个 sas 令牌并使用带有 sas 令牌的 https
方案来访问文件或将文件下载为流然后读取它与 pandas。同时,您还将存储帐户挂载为文件系统,然后按照@CHEEKATLAPRADEEP-MSFT 所述访问文件。
例如
- 使用 sas 令牌访问
通过 Azure 门户创建 sas 令牌
代码
pdf=pd.read_excel('https://<account name>.dfs.core.windows.net/<file system>/<path>?<sas token>')
print(pdf)
- 将文件下载为流并读取文件
在数据块中使用 pip 安装包
azure-storage-file-datalake
和xlrd
代码
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
例如
通过 maven 添加包
com.crealytics:spark-excel_2.12:0.13.1
。此外,请注意,如果您使用 scala 2.11,请添加包com.crealytics:spark-excel_2.11:0.13.1
代码
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) )