簡體   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