![](/img/trans.png)
[英]How to convert RDD[CassandraRow] to List[CassandraRow] in scala without using collec()
[英]How to convert RDD[CassandraRow] to DataFrame?
当前,这就是我将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转换为数据帧吗?
我的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”)
引用SparkContextFunctions的scaladoc (删除隐式参数):
cassandraTable [T](键空间:字符串,表:字符串):CassandraTableScanRDD [T]以CassandraRDD的形式返回Cassandra表的视图。 通过导入
com.datastax.spark.connector._
可以在SparkContext上使用此方法。根据传递给cassandraTable的type参数,每一行都将转换为以下之一:
- 一个CassandraRow对象(默认,如果未指定类型)
- 一个元组,其中的列值与CassandraRDD#select选择的列的顺序相同
- 用户定义的类的对象,由适当的ColumnMapper填充
因此,我建议使用以下内容:
ssc.cassandraTable[String]("db", "table").select("createdon")
这应该为您提供最简单的方法来访问每个文档上的createdon
。
我也想知道,为什么你不使用如描述的火花卡桑德拉-接口支持数据帧的数据集 。 这样,您的代码可能会变得稍微简单一些。
您可以尝试用Spark SQL的结构化流替换Spark Streaming( 几乎已经过时):
结构化流是基于Spark SQL引擎构建的可伸缩且容错的流处理引擎。 您可以像对静态数据进行批处理计算一样来表示流计算。 当流数据继续到达时,Spark SQL引擎将负责逐步递增地运行它并更新最终结果。
但是我不确定Cassandra Spark Connector是否支持它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.