如何将XLSX或XLS文件读取为Spark DataFrame

时间:2019-06-03 11:05:45

标签: python-3.x azure databricks

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

我已经尝试使用熊猫阅读,然后尝试转换为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)

4 个答案:

答案 0 :(得分:2)

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

火花

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

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

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

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

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

熊猫

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

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

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

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

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

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

答案 1 :(得分:1)

如@matkurek所述,您可以直接从excel阅读。确实,与熊猫相比,这应该是更好的做法,因为那样的话,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"))

答案 2 :(得分:0)

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

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

enter image description here

您可以在我的列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'>

enter image description here

如果我们尝试通过dtypes检查df列中的df.dtypes,我们将看到。

enter image description here

dtype的{​​{1}}是Bobject函数无法从真实数据中推断出列B的真实数据类型。因此,要解决此问题,解决方案是传递一个模式,以帮助B列的数据类型推断,如下代码所示。

spark.createDateFrame

强制将列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) ,以解决数据类型冲突。

enter image description here

答案 3 :(得分:0)

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

集群>集群>库>安装新>选择Maven并在“坐标”中粘贴 com.crealytics:spark-excel_2.11:0.12.2

之后,这就是读取文件的方式:

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