如何使用pyspark读取excel文件?

v7pvogib  于 2021-07-13  发布在  Spark
关注(0)|答案(2)|浏览(1345)

我正在尝试使用aws emr中的pyspark来读取它驻留在s3中的excel文件,为此我下载了spark-excel jars spark-excel_2.11-0.12.4.jar和spark-excel_2.12-0.13.5.jar,并将其放入s3 bucket中

scenario 1:
===========
df = spark.read.format("com.crealytics.spark.excel").option("useHeader", "true").option("inferschema", "true").load("s3://bucket/abc.xlsx")

spark-submit --jars s3://Bucket/spark-excel_2.11-0.12.4.jar test.py

Error:
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/collections4/IteratorUtils

scenario2:
=========
df = spark.read.format("com.crealytics.spark.excel").option("header", "true").option("inferschema", "true").load("s3://bucket/abc.xlsx")

spark-submit --jars s3://Bucket/spark-excel_2.12-0.13.5.jar test.py

Error:
py4j.protocol.Py4JJavaError: An error occurred while calling o79.load.
: java.lang.NoSuchMethodError: scala.Product.$init$(Lscala/Product;)

有人能帮我解决这个问题吗?谢谢你的帮助!

2hh7jdfx

2hh7jdfx1#

您可以直接从excel中读取。事实上,这应该是一个比Pandas更好的做法,因为从那时起,星火的好处将不复存在。
您可以运行与上面定义的相同的代码示例,但只需将所需的类添加到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") \
.load("your_file"))
dy1byipe

dy1byipe2#

可能excel文档可以放入驱动程序的内存中。在这种情况下,我将使用pandas直接从s3中读取文件,然后创建一个sparkDataframe来读取它。尝试以下操作:

import pandas as pd
pdf = pd.read_excel("s3://bucket/abc.xlsx")
pdf
   col1 col2
0   1.2    a
1   2.3    b

sdf = spark.createDataFrame(pdf)
sdf.show()

+----+----+
|col1|col2|
+----+----+
| 1.2|   a|
| 2.3|   b|
+----+----+

编辑:
这种建议的方法只适用于极少数您可能希望与其他Dataframe连接的文件。如果您的大数据集来自xlsx文件,我建议您遵循 com.crealytics.spark.excel 解决方案。然而,我更担心的是在第一时间使用excel格式。

相关问题