![](/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.