PHOENIX SPARK - 将表加载为DataFrame

时间:2016-05-18 03:38:44

标签: apache-spark dataframe phoenix

我已经从拥有5亿行的HBase表(PHOENIX)创建了一个DataFrame。在DataFrame中,我创建了一个JavaBean的RDD,并使用它来连接文件中的数据。

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加载到内存中?

1 个答案:

答案 0 :(得分:2)

您的陈述

 #access ul li:hover > ul {
    display: block;
 }

会将整个表加载到内存中。您还没有为phoenix提供任何过滤器以向下推入hbase - 从而减少读取的行数。

如果您连接到非HBase数据源(例如平面文件),那么首先需要读入hbase表中的所有记录。与辅助数据源不匹配的记录将不会保存在新的DataFrame - 但初始读数仍然会发生。

更新可能的方法是预处理文件 - 即提取您想要的ID。将结果存储到新的HBase表中。然后通过Phoenix 而不是Spark 直接在HBase中执行连接。

该方法的基本原理是将计算移动到数据。大部分数据驻留在HBase中 - 然后将小数据(文件中的id)移动到那里。

除了它在hbase之上提供了一个sql层之外,我对Phoenix并不熟悉。据推测,它能够进行这样的连接并将结果存储在单独的HBase表中。然后可以将该单独的表加载到Spark中,以便在后续计算中使用。