繁体   English   中英

怎么把RDD [CassandraRow]转换成DataFrame?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM