如何读取 xlsx 或 xls 文件作为火花数据帧

Rav*_*ran 3 azure python-3.x databricks

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

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

错误:

Cannot merge type <class 'pyspark.sql.types.DoubleType'> and <class 'pyspark.sql.types.StringType'>
Run Code Online (Sandbox Code Playgroud)

代码:

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

小智 8

正如@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()
Run Code Online (Sandbox Code Playgroud)

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

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


Pet*_*Pan 7

你的帖子中没有显示你的excel数据,但我重现了与你相同的问题。

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

在此输入图像描述

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

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

import pandas

df = pandas.read_excel('test.xlsx', sheet_name='Sheet1',inferSchema='')
sdf = spark.createDataFrame(df)
Run Code Online (Sandbox Code Playgroud)

它会返回与你相同的错误。

TypeError: field B: Can not merge type <class 'pyspark.sql.types.DoubleType'> and class 'pyspark.sql.types.StringType'>

在此输入图像描述

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

在此输入图像描述

ColumndtypeBobject,该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)
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述


And*_*ino 5

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

火花

您应该在数据块集群上安装以下 2 个库:

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

  2. 集群 -> 选择您的集群 -> 库 -> 安装新 -> PyPI-> 在包中xlrd

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

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

熊猫

您应该在数据块集群上安装以下 2 个库:

  1. 集群 -> 选择您的集群 -> 库 -> 安装新 -> PyPI-> 在包中xlrd

  2. 集群 -> 选择您的集群 -> 库 -> 安装新 -> PyPI-> 在包中openpyxl

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

import pandas
pandasDF = pd.read_excel(io = filePath, engine='openpyxl', sheet_name = 'NameOfYourExcelSheet') 
Run Code Online (Sandbox Code Playgroud)

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