任何人都可以在不转换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)
答案 0 :(得分:2)
我尝试根据@matkurek 和@Peter Pan 的回答在 2021 年 4 月给出一般更新版本。
火花
您应该在数据块集群上安装以下 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)
熊猫
您应该在数据块集群上安装以下 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。
答案 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
的数据,如下所示。
您可以在我的列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'>
如果我们尝试通过dtypes
检查df
列中的df.dtypes
,我们将看到。
列dtype
的{{1}}是B
,object
函数无法从真实数据中推断出列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)
,以解决数据类型冲突。
答案 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)