Scala 如何将RDD[CassandraRow]转换为数据帧?
目前,我正在将Cassandrarow RDD转换为数据帧:Scala 如何将RDD[CassandraRow]转换为数据帧?,scala,apache-spark,apache-spark-sql,spark-streaming,spark-cassandra-connector,Scala,Apache Spark,Apache Spark Sql,Spark Streaming,Spark Cassandra Connector,目前,我正在将Cassandrarow RDD转换为数据帧: val ssc = new StreamingContext(sc, Seconds(15)) val dstream = new ConstantInputDStream(ssc, ssc.cassandraTable("db", "table").select("createdon")) import sqlContext.implicits._ dstream.foreachRDD{ rdd => val d
val ssc = new StreamingContext(sc, Seconds(15))
val dstream = new ConstantInputDStream(ssc, ssc.cassandraTable("db", "table").select("createdon"))
import sqlContext.implicits._
dstream.foreachRDD{ rdd =>
val dataframeJobs = rdd.map(w => (w.dataAsString)).map(_.split(":")).map(x =>(x(1))).map(_.split(" ")).map(x =>(x(1))).toDF("ondate")
}
如您所见,我首先将cassandraRow rdd转换为字符串,然后映射到我想要的格式。我发现这个方法变得复杂,因为rdd包含多个冒号,而不是示例中所示的一个冒号(createdon)
有没有其他简单的方法将cassandraRow RDD转换为dataframe
我的build.sbt如下所示:
scalaVersion := "2.11.8"
libraryDependencies ++= Seq(
"com.datastax.spark" %% "spark-cassandra-connector" % "2.0.1",
"org.apache.spark" %% "spark-core" % "2.0.2" % "provided",
"org.apache.spark" %% "spark-sql" % "2.0.2",
"org.apache.spark" %% "spark-streaming" % "2.0.2"
)
我想出了一种替代方法,可以有效地处理任意数量的列: rdd.keyBy(row=>(row.getString(“createdon”)).map(x=>x._1).toDF(“ondate”)引用的scaladoc(删除隐式参数): cassandraTable[T](键空间:String,表:String):CassandraTableScanRDD[T]将Cassandra表的视图作为CassandraRDD返回。通过导入
com.datasax.spark.connector,可以在SparkContext上使用此方法
根据传递给cassandraTable的类型参数,每一行都将转换为以下内容之一:
ssc.cassandraTable[String]("db", "table").select("createdon")
- CassandraRow对象(如果未指定类型,则为默认值)
- 包含列值的元组,其顺序与CassandraRDD#select选择的列相同
- 对象,由适当的列映射器填充
因此,我建议使用以下方法:
ssc.cassandraTable[String]("db", "table").select("createdon")
这将为您提供根据文档访问createdon
的最简单方法
我还想知道为什么不使用spark cassandra连接器支持的数据帧,如中所述。这样,您的代码可能会稍微简单一些
您可以尝试用Spark SQL取代Spark Streaming(几乎已正式过时):
结构化流媒体是一个基于Spark SQL引擎构建的可扩展且容错的流媒体处理引擎。您可以用表示静态数据上的批处理计算的相同方式来表示流计算。Spark SQL引擎将负责以增量和连续方式运行它,并在流数据继续到达时更新最终结果
但是,我不确定Cassandra Spark Connector是否支持它。您可以在一个映射中完成,而不是嵌套映射,如dstream.map(stream=>stream.toString.split(“:”)(0)。split(“”)(1)).toDF(“ondate”)
您的用例是什么?是否要在每个流媒体间隔加载cassandra表?稍后您会如何处理它?是的,我想在每个流媒体间隔加载cassandra表。我正在将spark计算结果写入另一个表。