我已经从拥有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加载到内存中?
答案 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中,以便在后续计算中使用。