Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何将RDD[CassandraRow]转换为数据帧?_Scala_Apache Spark_Apache Spark Sql_Spark Streaming_Spark Cassandra Connector - Fatal编程技术网

Scala 如何将RDD[CassandraRow]转换为数据帧?

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

目前,我正在将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 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计算结果写入另一个表。