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)
你的帖子中没有显示你的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
Columndtype的B为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)
Run Code Online (Sandbox Code Playgroud)
强制将B列设为as,StringType解决数据类型冲突。
我尝试根据@matkurek 和@Peter Pan 的回答在 2021 年 4 月给出一个通用的更新版本。
火花
您应该在数据块集群上安装以下 2 个库:
集群 -> 选择您的集群 -> 库 -> 安装新 -> Maven -> 在坐标中:com.crealytics:spark-excel_2.12:0.13.5
集群 -> 选择您的集群 -> 库 -> 安装新 -> 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 个库:
集群 -> 选择您的集群 -> 库 -> 安装新 -> PyPI-> 在包中:xlrd
集群 -> 选择您的集群 -> 库 -> 安装新 -> 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。
| 归档时间: |
|
| 查看次数: |
28608 次 |
| 最近记录: |