Java 从Spark连接到SAPHANA
我试图通过JAVA代码在SAP HANA上使用spark sql执行查询。在调用数据帧对象上的任何操作时,当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;
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”