我正在尝试将已安装一台PC的scylladb表读取到另一台PC上的pyspark数据框中。
两台电脑具有ssh连接,我能够通过python代码读取表格,仅在与spark连接时才出现问题。我使用了以下连接器:
--packages datastax:spark-cassandra-connector:2.3.0-s_2.11 ,
我的spark -version = 2.3.1,scala-version-2.11.8。
**First Approach**
from pyspark import SparkConf
from pyspark import SparkContext
from pyspark.sql import SparkSession
conf = SparkConf().set("spark.cassandra.connection.host","192.168.0.118")
sc = SparkContext(conf = conf)
spark=SparkSession.builder.config(conf=conf).appName('FinancialRecon').getOrCreate()
sqlContext =SQLContext(sc)
data=spark.read.format("org.apache.spark.sql.cassandra").options(table="datarecon",keyspace="finrecondata").load().show()
产生的错误:
文件“ /usr/local/spark/python/lib/pyspark.zip/pyspark/sql/readwriter.py”,第172行,已加载 调用中的文件“ /usr/local/spark/python/lib/py4j-0.10.7-src.zip/py4j/java_gateway.py”,行1257 装饰中的文件“ /usr/local/spark/python/lib/pyspark.zip/pyspark/sql/utils.py”,第63行 在get_return_value中的第328行中的文件“ /usr/local/spark/python/lib/py4j-0.10.7-src.zip/py4j/protocol.py” py4j.protocol.Py4JJavaError:调用o43.load时发生错误。 :java.lang.ClassNotFoundException:org.apache.spark.Logging已在Spark 2.0中删除。请检查您的库是否与Spark 2.0兼容 在org.apache.spark.sql.execution.datasources.DataSource $ .lookupDataSource(DataSource.scala:646) 在org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:190) 在org.apache.spark.sql.DataFrameReader.load(DataFrameReader.scala:164) 在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke(Method.java:498) 在py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:244) 在py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) 在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.lang.Thread.run(Thread.java:748) 造成原因:java.lang.NoClassDefFoundError:org / apache / spark / Logging 在java.lang.ClassLoader.defineClass1(本机方法) 在java.lang.ClassLoader.defineClass(ClassLoader.java:763) 在java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) 在java.net.URLClassLoader.defineClass(URLClassLoader.java:467) 在java.net.URLClassLoader.access $ 100(URLClassLoader.java:73) 在java.net.URLClassLoader $ 1.run(URLClassLoader.java:368) 在java.net.URLClassLoader $ 1.run(URLClassLoader.java:362) 在java.security.AccessController.doPrivileged(本机方法) 在java.net.URLClassLoader.findClass(URLClassLoader.java:361) 在java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:349) 在java.lang.ClassLoader.loadClass(ClassLoader.java:411) 在java.lang.ClassLoader.loadClass(ClassLoader.java:357) 在org.apache.spark.sql.execution.datasources.DataSource处$$ anonfun $ 23 $$ anonfun $ apply $ 15.apply(DataSource.scala:618) 在org.apache.spark.sql.execution.datasources.DataSource处$$ anonfun $ 23 $$ anonfun $ apply $ 15.apply(DataSource.scala:618) 在scala.util.Try $ .apply(Try.scala:192) 位于org.apache.spark.sql.execution.datasources.DataSource $$ anonfun $ 23.apply(DataSource.scala:618) 位于org.apache.spark.sql.execution.datasources.DataSource $$ anonfun $ 23.apply(DataSource.scala:618) 在scala.util.Try.orElse(Try.scala:84) 在org.apache.spark.sql.execution.datasources.DataSource $ .lookupDataSource(DataSource.scala:618) ...另外13个 引起原因:java.lang.ClassNotFoundException:org.apache.spark.Logging 在java.net.URLClassLoader.findClass(URLClassLoader.java:381) 在java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在sun.misc.Launcher $ AppClassLoader.loadClass(Launcher.java:349) 在java.lang.ClassLoader.loadClass(ClassLoader.java:357) ...还有33
我使用的另一种方法是:
data=sc.read.format("org.apache.spark.sql.cassandra").options(table="datarecon",keyspace="finrecondata").load().show()
为此,我得到:
AttributeError:“ SparkContext”对象没有属性“ read”
第三种方法:
data=sqlContext.read.format("org.apache.spark.sql.cassandra").options(table="datarecon",keyspace="finrecondata").load().show()
为此,我遇到与第一种方法相同的错误。
请告知是scylla spark连接器问题还是一些spark库问题以及如何解决。
答案 0 :(得分:1)
执行以下步骤:
1。运行packages行的spark-shell。要使用--conf配置默认的Spark Configuration传递密钥值对,在我的情况下,scylla主机为172.17.0.2
bin/spark-shell --conf spark.cassandra.connection.host=172.17.0.2 --packages datastax:spark-cassandra-connector:2.3.0-s_2.11
2。在SparkContext,SparkSession,RDD和DataFrame上启用Cassandra特定的功能:
import com.datastax.spark.connector._
import org.apache.spark.sql.cassandra._
3。从scylla加载数据
val rdd = sc.cassandraTable("my_keyspace", "my_table")
4。测试
scala> rdd.collect().foreach(println)
CassandraRow{id: 1, name: ash}
答案 1 :(得分:0)
由于版本冲突而导致产生的错误。也许您可以阅读here来解决它。
第一种方法将起作用,因为SparkSession上提供了read方法。