【问题标题】:How to read xlsx or xls files as spark dataframe如何将 xlsx 或 xls 文件读取为 spark 数据框
【发布时间】: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)

【问题讨论】:

    标签: python-3.x azure databricks


    【解决方案1】:

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

    火花

    您应该在 databricks 集群上安装以下 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)
    

    熊猫

    您应该在 databricks 集群上安装以下 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。

    【讨论】:

    • 据我所知,从 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))

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-11-27
          相关资源
          最近更新 更多