Java 从Spark连接到SAPHANA

Java 从Spark连接到SAPHANA,java,jdbc,apache-spark,apache-spark-sql,Java,Jdbc,Apache Spark,Apache Spark Sql,我试图通过JAVA代码在SAP HANA上使用spark sql执行查询。在调用数据帧对象上的任何操作时,当df.count()时,我在下面的代码段中得到java.io.NotSerializableException.In,则引发NotSerializableException public class SaphanaTest implements Serializable { private static final long serialVersionUID = 1L;

我试图通过JAVA代码在SAP HANA上使用spark sql执行查询。在调用数据帧对象上的任何操作时,当
df.count()时,我在下面的代码段中得到java.io.NotSerializableException.In,则引发NotSerializableException

public class SaphanaTest implements Serializable {

    private static final long serialVersionUID = 1L;

    public void call() {

        SparkConf sparkconf = new SparkConf().set("spark.master", "local[*]");

        SparkContext sc = new SparkContext(sparkconf);
        HiveContext sqlContext = new HiveContext(sc);

        try {
            Class.forName("com.sap.db.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        Map<String, String> options = new HashMap<String, String>();
        options.put("url",
                "jdbc:sap://<IP>:30015/system");
        options.put("user", "SYSTEM");
        options.put("password", "Saphana123");
        options.put("dbtable", "SYSTEM.TEST1");

        DataFrame df = sqlContext.load("jdbc", options);

        df.registerTempTable("temp");
        df = sqlContext.sql("select * from temp");

        long count = df.count();
        sc.stop();
    }

    public static void main(String[] args) {
        SaphanaTest test = new SaphanaTest();
        test.call();
}
}
公共类SaphanaTest实现可序列化{
私有静态最终长serialVersionUID=1L;
公开作废通知(){
SparkConf SparkConf=新的SparkConf().set(“spark.master”、“local[*]”);
SparkContext sc=新的SparkContext(sparkconf);
HiveContext sqlContext=新的HiveContext(sc);
试一试{
Class.forName(“com.sap.db.jdbc.Driver”);
}catch(classnotfounde异常){
e、 printStackTrace();
}
Map options=newhashmap();
options.put(“url”,
“jdbc:sap://:30015/system”);
期权。看跌期权(“用户”、“系统”);
期权。看跌期权(“密码”、“Saphana123”);
看跌期权(“dbtable”、“SYSTEM.TEST1”);
DataFrame df=sqlContext.load(“jdbc”,选项);
df.寄存器可清空(“临时”);
df=sqlContext.sql(“select*from temp”);
长计数=df.count();
sc.停止();
}
公共静态void main(字符串[]args){
SaphanaTest test=新的SaphanaTest();
test.call();
}
}
错误堆栈跟踪:

线程“main”org.apache.spark.SparkException中出现异常:任务在 org.apache.spark.util.ClosureCleaner$.ensureSerializable(ClosureCleaner.scala:315) 在 org.apache.spark.util.ClosureCleaner$.org$apache$spark$util$ClosureCleaner$$clean(ClosureCleaner.scala:305) 在 org.apache.spark.util.ClosureCleaner$.clean(ClosureCleaner.scala:132) 位于org.apache.spark.SparkContext.clean(SparkContext.scala:1893) org.apache.spark.SparkContext.runJob(SparkContext.scala:1766)位于 org.apache.spark.rdd.rdd$$anonfun$toLocalitator$1.org$apache$spark$rdd$rdd$$anonfun$$collectPartition$1(rdd.scala:900)位于 org.apache.spark.rdd.rdd$$anonfun$toLocalitator$1$$anonfun$apply$30.apply(rdd.scala:902) 在 org.apache.spark.rdd.rdd$$anonfun$toLocalitator$1$$anonfun$apply$30.apply(rdd.scala:902) 位于scala.collection.Iterator$$anon$13.hasNext(Iterator.scala:371) scala.collection.convert.Wrappers$IteratorWrapper.hasNext(Wrappers.scala:29) 在com.property.saphana.SaphanaTest.main(SaphanaTest.java:48) 收件人:java.io.NotSerializableException:com.sap.db.jdbc.topology.Host 序列化堆栈: -对象不可序列化(类:com.sap.db.jdbc.topology.Host,值:172.26.52.54:30015) -writeObject数据(类:java.util.ArrayList) -对象(类java.util.ArrayList,[172.26.52.54:30015]) -writeObject数据(类:java.util.Hashtable) -对象(类java.util.Properties,{dburl=jdbc:sap://172.26.52.54:30015,用户=系统, 密码=Saphana123, url=jdbc:sap://172.26.52.54:30015/?system&user=SYSTEM&password=Saphana123, dbtable=SYSTEM.TEST1,hostlist=[172.26.52.54:30015]}) -字段(类:org.apache.spark.sql.jdbc.JDBCRDD$$anonfun$getConnector$1,名称: 属性$1,类型:class java.util.properties) -对象(类org.apache.spark.sql.jdbc.JDBCRDD$$anonfun$getConnector$1, )

有什么建议吗? 在对google进行研究之后,我发现了一个建议,可以让连接属性序列化。但我不知道如何让它在spark中序列化

谢谢你在这方面的帮助。 提前感谢。

注意:本帖中的部分解决了我的问题,您也可以尝试:

注意:我已经使用最新版本的Hana JDBC驱动程序(ngdbc.jar)在SPS10和SPS12系统上测试了Spark,这两个版本似乎都运行良好。旧版本的驱动程序在Spark中出现以下错误:“org.apache.Spark.SparkException:作业因阶段失败而中止:任务不可序列化:java.io.notserializableeexception:com.sap.db.jdbc.topology.Host”