【问题标题】:Inserting into cassandra table from spark dataframe results in org.codehaus.commons.compiler.CompileException: File 'generated.java' Error从 spark 数据帧插入 cassandra 表会导致 org.codehaus.commons.compiler.CompileException: File 'generated.java' Error
【发布时间】:2020-02-23 20:30:04
【问题描述】:

我正在使用 spark-sql.2.4.1v、datastax-java-cassandra-connector_2.11-2.4.1.jar 和 java8。

我这样创建 cassandra 表

create company(company_id int PRIMARY_KEY, company_name text);

JavaBean如下:

class CompanyRecord(
 Integer company_id;
 String company_name;
//getter and setters
//default & parametarized constructors
)

下面的spark代码将数据保存到cassandra表中:

Dataset<Row> latestUpdatedDs = joinUpdatedRecordsDs.select("company_id", "company_name"); /// select from other source like xls sheet

Encoder<CompanyRecord> comanyEncoder =  Encoders.bean(CompanyRecord.class);         
Dataset<CompanyRecord> inputDs = latestUpdatedDs.as(comanyEncoder );


 inputDs 
        .write()
        .format("org.apache.spark.sql.cassandra")
        .option("table","company")
        .option("keyspace",  "ks_one")
        .mode(SaveMode.Append)
        .save();

给出错误如下:

原因:org.codehaus.commons.compiler.CompileException:文件'generated.java',第562行,第35列:编译失败:org.codehaus.commons.compiler.CompileException:文件'generated.java',第 562 行,第 35 列:名为“toString”的方法未在任何封闭类或任何超类型中声明,也未通过静态导入声明 在 org.apache.spark.sql.catalyst.expressions.codegen.CodeGenerator$.org$apache$spark$sql$catalyst$expressions$codegen$CodeGenerator$$doCompile(CodeGenerator.scala:1304) 在 org.apache.spark.sql.catalyst.expressions.codegen.CodeGenerator$$anon$1.load(CodeGenerator.scala:1376) 在 org.apache.spark.sql.catalyst.expressions.codegen.CodeGenerator$$anon$1.load(CodeGenerator.scala:1373) 在 org.spark_project.guava.cache.LocalCache$LoadingValueReference.loadFuture(LocalCache.java:3599) 在 org.spark_project.guava.cache.LocalCache$Segment.loadSync(LocalCache.java:2379)

问题:

如何找出这里出了什么问题?以及如何解决这个问题?

【问题讨论】:

    标签: java apache-spark cassandra datastax-java-driver spark-cassandra-connector


    【解决方案1】:

    据我所知:

    第 562 行,第 35 列:名为“toString”的方法未在任何封闭类或任何超类型中声明。

    这可能是问题所在,您可能需要覆盖 CompanyRecord 类的 toString 并且 Spark 还可以处理实现了 https://spark.apache.org/docs/latest/tuning.html 中提到的 Serializable 接口的自定义对象。

    这两件事应该可以解决你的问题。

    【讨论】:

      【解决方案2】:

      当数据类型不匹配时会出现此问题,即您在表中定义的内容与您的 bean/dataframe 尝试插入的内容。

      一旦我正确地更正了数据类型,问题就解决了。

      【讨论】:

      • 是的,那么它不言自明,CompanyRecord 类中的列和数据类型需要与数据库列名和数据类型匹配。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-18
      • 2020-07-17
      • 2017-01-07
      • 2017-05-06
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      相关资源
      最近更新 更多