当前位置: 首页 > 知识库问答 >
问题:

结合delta io和excel阅读

林弘文
2023-03-14
spark = SparkSession.builder.appName("Word Count")
.config("spark.jars.packages", "com.crealytics:spark-excel_2.12:0.14.0")
.getOrCreate()

df = spark.read.format("com.crealytics.spark.excel")
.option("header", "true")
.load(path2)
builder = SparkSession.builder.appName("transaction")
.config("spark.jars.packages", "com.crealytics:spark-excel_2.12:0.14.0")
.config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension")
.config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog")

spark = configure_spark_with_delta_pip(builder).getOrCreate()

给出以下错误:

PY4JJavaError:调用O139.Load时出错。:java.lang.ClassNotFoundException:未能找到html" target="_blank">数据源:com.crealytics.spark.excel。请在http://spark.apache.org/third-party-projects.html找到包,地址为org.apache.spark.sql.execution.datasources.datasource$.lookupdatasource(datasource.scala:692)地址为org.apache.spark.sql.execution.datasources.datasource$.lookupdatasource2(datasource.scala:746)地址为org.apache.spark.sql.dataframereader.load(239)在java.base/jdk.internal.reflect.nativeMethodAccessorImpl.Invoke0(原生方法)在java.base/jdk.internal.reflect.nativeMethodAccessorImpl.invoke(nativeMethodAccessorImpl.invoke(nativeMethodAccessorImpl.java:62)在在py4j.gateway.invoke(gateway.java:282)在py4j.commands.abstractCommand.invokeMethod(AbstractCommand.java:132)在py4j.commands.callcommand.execute(callcommand.java:79)在py4j.gatewayConnection.run(gatewayConnection.java:238)在java.base/java.lang.thread.run(thread.java:829)在java.base/java.lang.thread.run(thread.java:829)在java.base/java.net.urlClassLoader.findclass(urlClassLoader.java:471)在spark.sql.execution.datasources.datasource$.$$anonfun$lookupdatasource$5(datasource.scala:666)at scala.util.try$.applic(try.scala:213)at org.apache.spark.sql.execution.datasources.datasource$.$$anonfun$lookupdatasource$4(datasource.scala:666)at scal.apache.spark.sql.execution.datasource:666)at

为什么?我该怎么避免呢?

共有1个答案

夏侯昊明
2023-03-14

之所以出现此错误,是因为configure_spark_with_delta_pip覆盖/替换了要导入适当的delta lake包的配置属性spark.jars.packages。因此,您的包com.crealytics:spark-excel2.12:0.14.0可能不可用/无法导入。在这里查看源代码的一个片段

    scala_version = "2.12"
    maven_artifact = f"io.delta:delta-core_{scala_version}:{delta_version}"

    return spark_session_builder.config("spark.jars.packages", maven_artifact) 

不幸的是,构建器不允许我们检索现有的配置属性或sparkconf对象,以便在调用getorcreate创建或触发会话之前动态调整这些属性。

要解决这个问题,您可以自己检索适当的delta包,类似于configure_spark_with_delta_pip这样做的方式。


import importlib_metadata
delta_version = importlib_metadata.version("delta_spark")
scala_version = "2.12"
delta_package = f"io.delta:delta-core_{scala_version}:{delta_version}"

builder = SparkSession.builder.appName("transaction")
.config("spark.jars.packages", f"com.crealytics:spark-excel_2.12:0.14.0,{delta_package}")
.config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension")
.config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog")

spark = configure_spark_with_delta_pip(builder).getOrCreate()


要解决这个问题,可以在使用configure_spark_with_delta_pip应用delta包后创建spark会话。之后,您可以使用更新的配置属性触发spark会话的重新启动。

如。

builder = SparkSession.builder.appName("transaction")
.config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension")
.config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog")

spark = configure_spark_with_delta_pip(builder).getOrCreate()

builder = SparkSession.builder.appName("transaction")
.config("spark.jars.packages", "com.crealytics:spark-excel_2.12:0.14.0")

spark = builder.getOrCreate()

由于两个spark会话都具有相同的appnamegetorcreate将检索现有的spark会话,但也将应用新的配置。此行为在此记录为

>>> s2 = SparkSession.builder.config("k2", "v2").getOrCreate()
>>> s1.conf.get("k1") == s2.conf.get("k1") 
True
>>> s1.conf.get("k2") == s2.conf.get("k2") 
True
 类似资料:
  • 问题内容: 我有一个带有许多选项卡的Excel工作簿。每个选项卡与所有其他选项卡具有相同的标题集。我想将每个选项卡中的所有数据合并到一个数据帧中(而无需重复每个选项卡的标题)。 到目前为止,我已经尝试过: 可以在parse参数中使用表示“所有电子表格”的内容吗?还是这是错误的方法? 提前致谢! 更新:我尝试过: 但这不是“工作”。 问题答案: 这是一种实现方法-将所有工作表加载到数据帧的字典中,然

  • 本文向大家介绍结合Visual C#开发环境讲解C#中事件的订阅和取消订阅,包括了结合Visual C#开发环境讲解C#中事件的订阅和取消订阅的使用技巧和注意事项,需要的朋友参考一下 类或对象可以通过事件向其他类或对象通知发生的相关事情。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。 在典型的 C# Windows 窗体或 Web 应用程序中,可订阅由控件(如按钮和列表

  • 问题内容: 我正在尝试使用gson读取json,但无法获得“简单”的gson示例。 来自:https : //sites.google.com/site/gson/streaming 这是问题,如果我尝试: 它甚至没有建立。 似乎有一种根据Eclipse的方法: fromJson(JsonReader arg0,类型arg1) 问题答案: 更换 与 做到了!=)

  • 问题内容: 我想在CSS(或任何其他伪选择器)中结合使用。我基本上有一个列表,并且该类的项目具有使用施加的箭头形状。我希望对悬停的对象也是如此,但不能完全使其正常工作。继承人代码 问题答案: 只需以与选择器相同的方式将其追加到选择器即可:

  • 问题内容: 我目前的构建数量至少为10,因此我必须使用该库来实现。我已经设置了,但是我现在要添加一个,但是这需要扩展我的类,Java没有多个。我该怎么办? 问题答案: ListActivity尚未移植到AppCompat。可能是因为您应该认为它“已弃用”,而改用ListFragment。 片段将与ActionBarActivity一起使用,只需确保它们是支持库中的片段即可。 要通过读这大约片段的链

  • 问题内容: 我正在使用CodeIgniter编写的现有站点上工作,我们正在考虑将AngularJS用于需要大量前端功能的某些页面,但我们不想替换所有CodeIgniter视图(一次(尚未))。 因此,我单击了由angular的路由器控制的链接,该链接由javascript处理,但下一个链接可能是应由CodeIgniter框架处理的“正常”请求。 有两种结合这两种方法的优雅方法吗?我真的不介意一些额