如何将 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 <class 'pyspark.sql.types.DoubleType'> and class 'pyspark.sql.types.StringType'>
如果我们尝试通过df.dtypes
检查df
的dtypes
列,我们会看到。
B
列的dtype
为object
,spark.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 数据框的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C# 和 OleDbConnection 读取 .xlsx 和 .xls 文件?
c#如何使用ExcelPackage Plus读取excel(.xls和xlsx)中得数据