我正在尝试使用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存储桶中
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;)
有人能帮我解决这个问题吗?非常感谢您的帮助!
发布于 2021-02-13 16:48:56
您可以直接从excel中读取它。事实上,这应该是一个比熊猫更好的做法,因为从那时起,Spark的好处就不再存在了。
您可以运行与上面定义的相同的代码示例,但只需将所需的类添加到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"))
发布于 2021-02-13 08:05:54
也许excel文档可以放入驾驶员的内存中。在这种情况下,我会使用Pandas直接从S3读取文件,然后创建一个Spark DataFrame more it。尝试如下所示:
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|
+----+----+
编辑:
此建议的方法仅适用于您可能想要与其他数据帧连接的极少数文件。如果您的大数据集来自xlsx文件,我建议您遵循com.crealytics.spark.excel
解决方案。然而,我首先更担心的是使用excel格式。
https://stackoverflow.com/questions/66179952
复制相似问题