2015-05-26 45 views
0

我剛剛開始使用spark-cassandra連接器,並遇到以下問題:我有一部分位於cassandra中的數據集,部分位於HDFS(同一確切模式)。我想創建一套這兩套的UnionRDD,然後從那裏開始。Cassandra /拼花聯合RDD

我到目前爲止是這樣的代碼:

DataFrame df = sqlContext.parquetFile("foo.parquet"); 
JavaRDD cassandraRDD = (JavaRDD)javaFuntions(sc).cassandraTable("foo_ks","foo_table"); 
DataFrame cassandraDF = sqlContext.applySchema(cassandraRDD,df.schema()); 

我得到一個運行時錯誤說CassandraRow不能轉換爲spark.sql.Row,從applySchema電話來了...這是並非全部都令人驚訝。什麼纔是正確的方式來實現這個工作? (我的最終目標是聯盟df & cassandraDF)。

我想用Spark 1.3.1和Cassandra-spark的主分支構建。

+0

如果您收到異常,則首先打印模式並與cassandraRDD的字段進行比較。 – Kaushal

回答

0

簡單的方法是寫一個地圖功能,將採取

  1. 卡桑德拉行
  2. 源架構對象
  3. 目標架構對象

此地圖功能將

  1. 使用如此讀取cassandra行urce模式(和處理問題,如填充缺失的柱,抑制某些數據質量問題等行)
  2. 翻譯卡桑德拉模式引發SQL模式(這是一個靜態映射的B/W卡桑德拉類型到SQL類型)
  3. 返回與目標模式SQL Row對象

所以,你應該能夠做到llike

CDF = cRDD.map(C2R).createDataFrame()//地圖將返回行,以便不applySchema這裏需要

基本上,我會建議使用單個函數處理轉換。一旦你從cassandra數據中「創建」了一個DF,你就可以與任何其他DF結合。

+0

謝謝ayan--我希望不必手工編寫c2r,因爲我的行有70多個字段......無論如何,這些字段已經在cassandra中輸入。我會將您的答案標記爲已接受,因爲我認爲沒有簡單的方法... –

+0

那麼,您可能不需要「手動」。您可以打開一個單獨的JDBC連接並從Cassandra獲取架構信息。然後你可以在c2r中使用它。這樣,即使模式更改,也不需要更改代碼。它的核心點是,我們必須告訴模式的火花。順便說一下,新的卡桑德拉連接器已經出來了,或者我聽說過。你可以/應該看看.... –