如何在pyspark数据框中读取scylladb表

时间:2018-07-27 12:00:10

标签: apache-spark cassandra scylla

我正在尝试将已安装一台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库问题以及如何解决。

2 个答案:

答案 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方法。