2016-05-18 27 views
5

我已經從HBase Table(PHOENIX)創建了一個DataFrame,它有5億行。在DataFrame中,我創建了一個JavaBean的RDD,並使用它來加入文件中的數據。PHOENIX SPARK - 將數據表格載入數據框

Map<String, String> phoenixInfoMap = new HashMap<String, String>(); 
phoenixInfoMap.put("table", tableName); 
phoenixInfoMap.put("zkUrl", zkURL); 
DataFrame df = sqlContext.read().format("org.apache.phoenix.spark").options(phoenixInfoMap).load(); 
JavaRDD<Row> tableRows = df.toJavaRDD(); 
JavaPairRDD<String, AccountModel> dbData = tableRows.mapToPair(
new PairFunction<Row, String, String>() 
{ 
    @Override 
    public Tuple2<String, String> call(Row row) throws Exception 
    { 
     return new Tuple2<String, String>(row.getAs("ID"), row.getAs("NAME")); 
    } 
}); 

現在我的問題 - 讓我們說這個文件有2個唯一的與表匹配的條目。整個表是作爲RDD加載到內存中的,還是隻有來自表的匹配200萬條記錄纔會作爲RDD加載到內存中?

+0

Hi @Mohan您好,請讓我知道'DataFrame df = sqlContext.read()。format(「org.apache.phoenix.spark」)。options(phoenixInfoMap).load()'方法的構建依賴關係。我正在做同樣的事情,但得到'java.lang.NoSuchMethodError' – Explorer

回答

2

你的陳述

DataFrame df = sqlContext.read().format("org.apache.phoenix.spark").options(phoenixInfoMap) 
.load(); 

將整個表加載到內存中。你還沒有提供任何phoenix的過濾器來推入hbase - 並因此減少了讀取的行數。

如果您連接到非HBase數據源 - 例如平面文件 - 則首先需要讀入hbase表中的所有記錄。與輔助數據源不匹配的記錄將不會保存在新的DataFrame中 - 但最初的讀數仍然會發生。

更新一個潛在的方法是預處理文件 - 即提取你想要的id。將結果存儲到新的HBase表中。然後通過Phoenix 而不是Spark直接在HBase中執行加入。

該方法的基本原理是將移動到數據。大部分數據駐留在HBase中 - 然後將小數據(文件中的id)移動到那裏。

我並不熟悉Phoenix,只是它提供了一個基於hbase的sql層。據推測,它可以進行這樣的連接並將結果存儲在單獨的HBase表中。然後可以將該單獨的表格加載到Spark中,以便在後續計算中使用。

+0

謝謝@ javadba。有沒有一種有效的方法來處理這種情況?我只想從HBase表中加載文件中的200萬匹配項。 – Mohan

+0

我更新了OP來回答這個問題。 – javadba