Как добавить Spark-excel в PySpark

#apache-spark #apache-spark-sql

#apache-spark #apache-spark-sql

Вопрос:

Я пытаюсь прочитать xlsx в PySpark и попробовал несколько способов импортировать библиотеку Spark-excel, но я все еще получаю ошибки при чтении файла xlsx. Я использую Spark в автономном режиме на своем Mac.

Мой код:

 # spark configuration
spark_path = "/spark/spark-3.0.1-bin-hadoop2.7"
findspark.init(spark_path)
spark = SparkSession.builder.master("local").appName("Word Count").config("--packages com.crealytics:spark-excel_2.12:0.13.7").getOrCreate()

data_location = "bank_transactions.xlsx"
df = spark.read.format("com.crealytics.spark.excel").load(data_location)
 

Я получил следующую ошибку:

 Py4JJavaError: An error occurred while calling o37.load.
: java.lang.NoClassDefFoundError: scala/Product$class
    at com.crealytics.spark.excel.Utils$MapIncluding.<init>(Utils.scala:9)
    at com.crealytics.spark.excel.WorkbookReader$.<init>(WorkbookReader.scala:31)
    at com.crealytics.spark.excel.WorkbookReader$.<clinit>(WorkbookReader.scala)
    at com.crealytics.spark.excel.DefaultSource.createRelation(DefaultSource.scala:28)
    at com.crealytics.spark.excel.DefaultSource.createRelation(DefaultSource.scala:18)
    at com.crealytics.spark.excel.DefaultSource.createRelation(DefaultSource.scala:12)
    at org.apache.spark.sql.execution.datasources.DataSource.resolveRelation(DataSource.scala:344)
    at org.apache.spark.sql.DataFrameReader.loadV1Source(DataFrameReader.scala:297)
    at org.apache.spark.sql.DataFrameReader.$anonfun$load$2(DataFrameReader.scala:286)
    at scala.Option.getOrElse(Option.scala:189)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:286)
    at org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:232)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:564)
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244)
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357)
    at py4j.Gateway.invoke(Gateway.java:282)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:238)
    at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: java.lang.ClassNotFoundException: scala.Product$class
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:522)
    ... 23 more
 

Ответ №1:

Решения:

  1. Создайте каталог spark_jars в SPARK_HOME
  2. Обновите код для импорта библиотеки:
 findspark.init(spark_path)
spark = SparkSession.builder.master("local") 
    .appName("Word Count") 
    .config("spark.jars.packages","com.crealytics:spark-excel_2.12:0.13.7") 
    .getOrCreate()
spark