如何将 xlsx 或 xls 文件读取为 spark 数据框

Posted

技术标签:

【中文标题】如何将 xlsx 或 xls 文件读取为 spark 数据框【英文标题】:How to read xlsx or xls files as spark dataframe 【发布时间】:2019-06-03 11:05:45 【问题描述】:

任何人都可以在不转换 xlsx 或 xls 文件的情况下告诉我,我们如何将它们作为 spark 数据帧读取

我已经尝试使用 pandas 读取,然后尝试转换为 spark 数据帧,但出现错误,错误是

错误:

Cannot merge type <class 'pyspark.sql.types.DoubleType'> and <class 'pyspark.sql.types.StringType'>

代码:

import pandas
import os
df = pandas.read_excel('/dbfs/FileStore/tables/BSE.xlsx', sheet_name='Sheet1',inferSchema='')
sdf = spark.createDataFrame(df)

【问题讨论】:

【参考方案1】:

我尝试根据@matkurek 和@Peter Pan 的回答在 2021 年 4 月给出一个通用的更新版本。

火花

您应该在 databricks 集群上安装以下 2 个库:

    集群 -> 选择您的集群 -> 库 -> 安装新的 -> Maven -> 在坐标中:com.crealytics:spark-excel_2.12:0.13.5

    集群 -> 选择您的集群 -> 库 -> 安装新的 -> PyPI-> 在 Package 中:xlrd

然后,您将能够按如下方式读取您的 excel:

sparkDF = spark.read.format("com.crealytics.spark.excel") \
    .option("header", "true") \
    .option("inferSchema", "true") \
    .option("dataAddress", "'NameOfYourExcelSheet'!A1") \
    .load(filePath)

熊猫

您应该在 databricks 集群上安装以下 2 个库:

    集群 -> 选择您的集群 -> 库 -> 安装新的 -> PyPI-> 在 Package 中:xlrd

    集群 -> 选择您的集群 -> 库 -> 安装新的 -> PyPI-> 在 Package 中:openpyxl

然后,您将能够按如下方式读取您的 excel:

import pandas
pandasDF = pd.read_excel(io = filePath, engine='openpyxl', sheet_name = 'NameOfYourExcelSheet') 

请注意,您将有两个不同的对象,在第一个场景中是 Spark Dataframe,在第二个场景中是 Pandas Dataframe。

【讨论】:

据我所知,从 pandas 1.2.0 开始,您不应该对 xlsx 文件使用 xlrd(也不需要它),请参阅 @987654321 @。相反,请使用openpyxl【参考方案2】:

正如@matkurek 所述,您可以直接从excel 中读取它。实际上,这应该是比使用 pandas 更好的做法,因为 Spark 的好处将不再存在。

您可以运行与定义的 qbove 相同的代码示例,但只需将所需的类添加到 SparkSession 的配置中。

spark = SparkSession.builder \
.master("local") \
.appName("Word Count") \
.config("spark.jars.packages", "com.crealytics:spark-excel_2.11:0.12.2") \
.getOrCreate()

然后,你就可以读取你的excel文件了。

df = spark.read.format("com.crealytics.spark.excel") \
.option("useHeader", "true") \
.option("inferSchema", "true") \
.option("dataAddress", "'NameOfYourExcelSheet'!A1") \
.load("your_file"))

【讨论】:

【参考方案3】:

您的帖子中没有显示您的excel的数据,但我复制了与您相同的问题。

这是我的示例 excel test.xlsx 的数据,如下所示。

您可以在我的列B 中看到不同的数据类型:一个双精度值2.2 和一个字符串值C

所以如果我运行下面的代码,

import pandas

df = pandas.read_excel('test.xlsx', sheet_name='Sheet1',inferSchema='')
sdf = spark.createDataFrame(df)

它将返回与您相同的错误。

TypeError: field B: Can not merge type &lt;class 'pyspark.sql.types.DoubleType'&gt; and class 'pyspark.sql.types.StringType'&gt;

如果我们尝试通过df.dtypes 检查dfdtypes 列,我们会看到。

B列的dtypeobjectspark.createDateFrame函数无法从真实数据中推断出B列的真实数据类型。所以要修复它,解决方案是传递一个模式来帮助 B 列的数据类型推断,如下面的代码。

from pyspark.sql.types import StructType, StructField, DoubleType, StringType
schema = StructType([StructField("A", DoubleType(), True), StructField("B", StringType(), True)])
sdf = spark.createDataFrame(df, schema=schema)

强制将B列设为StringType以解决数据类型冲突。

【讨论】:

【参考方案4】:

您可以通过spark的读取功能读取excel文件。这需要一个 spark 插件,将其安装在 databricks 上:

clusters > your cluster > libraries > install new > 选择 Maven 并在“坐标”中粘贴 com.crealytics:spark-excel_2.12:0.13.5

之后,您可以通过以下方式读取文件:

df = spark.read.format("com.crealytics.spark.excel") \
    .option("useHeader", "true") \
    .option("inferSchema", "true") \
    .option("dataAddress", "'NameOfYourExcelSheet'!A1") \
    .load(filePath)

【讨论】:

不适合我:java.lang.ClassNotFoundException: Failed to find data source: com.crealytics.spark.excel. Please find packages at http://spark.apache.org/third-party-projects.html【参考方案5】:

只需打开文件 xlsx 或 xlms,在 pandas 中打开文件,然后在 spark 中打开文件

将熊猫导入为 pd

df = pd.read_excel('file.xlsx', engine='openpyxl')

df = spark_session.createDataFrame(df.astype(str))

【讨论】:

以上是关于如何将 xlsx 或 xls 文件读取为 spark 数据框的主要内容,如果未能解决你的问题,请参考以下文章

java如何读取一个加密后的.xls文件

如何使用 C# 和 OleDbConnection 读取 .xlsx 和 .xls 文件?

将 xls 转换为 xlsx 并删除旧文件

c#如何使用ExcelPackage Plus读取excel(.xls和xlsx)中得数据

如何根据文件头识别doc、docx、pdf、xls和xlsx

50_Pandas读取 Excel 文件 (xlsx, xls)