【问题标题】:How to read the Excel file using pyspark?如何使用 pyspark 读取 Excel 文件?
【发布时间】:2021-05-16 16:22:43
【问题描述】:

我正在尝试使用来自 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;)

有人可以帮我解决这个问题吗?感谢您的帮助!

【问题讨论】:

    标签: python pandas apache-spark pyspark apache-spark-sql


    【解决方案1】:

    可能excel文档可以放入驱动程序的内存中。在这种情况下,我会使用 Pandas 直接从 S3 读取文件,然后再创建一个 Spark DataFrame。尝试类似:

    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 格式。

    【讨论】:

    • 在使用 EMR 中的 pandas 时,是否需要任何软件包才能访问 S3 存储桶?
    • 我没有运行 EMR 来测试代码。理论上,pandas 在幕后使用 boto,它安装在 EMR 中。确保 EMR 具有从 S3 读取的访问角色。起点是这篇文章:stackoverflow.com/questions/37703634/…
    • 感谢您的信息,如果我们将来获得大量文件,我也在寻找其他方法。不知何故,这些 jars 根本无法工作。
    【解决方案2】:

    您可以直接从 excel 中读取它。实际上,这应该是比使用 pandas 更好的做法,因为 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"))
    

    【讨论】:

    • 我在将类添加到 Spark Session config("spark.jars.packages","com.crealytics:spark-excel_2.11-0.12.4") 后进行了测试,但我仍然有同样的错误引起:java.lang.NoClassDefFoundError: org/apache/commons/collections4/IteratorUtils。有什么想法吗?
    猜你喜欢
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    相关资源
    最近更新 更多