Moh*_*han 5 phoenix dataframe apache-spark
我已经从HBase表(PHOENIX)创建了一个DataFrame,它有5亿行.在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"));
}
});
Run Code Online (Sandbox Code Playgroud)
现在我的问题 - 让我们说该文件有2个与该表匹配的唯一百万条目.整个表是作为RDD加载到内存中还是只有表中匹配的200万条记录将作为RDD加载到内存中?
你的陈述
DataFrame df = sqlContext.read().format("org.apache.phoenix.spark").options(phoenixInfoMap)
.load();
Run Code Online (Sandbox Code Playgroud)
会将整个表加载到内存中。您没有为 phoenix 提供任何过滤器来推送到 hbase - 从而减少读取的行数。
如果您连接到非 HBase 数据源(例如平面文件),则首先需要读入 hbase 表中的所有记录。与辅助数据源不匹配的记录将不会保存在新的 DataFrame 中- 但最初的阅读仍然会发生。
更新 一种可能的方法是预处理文件 - 即提取您想要的 id。将结果存储到新的 HBase 表中。然后通过 Phoenix而不是 Spark直接在 HBase 中执行连接。
这种方法的基本原理是将计算转移到数据上。大部分数据驻留在 HBase 中 - 因此将小数据(文件中的 id)移动到那里。
我对 Phoenix 并不熟悉,只是它在 hbase 之上提供了一个 sql 层。据推测,它能够执行这样的连接并将结果存储在单独的 HBase 表中..?然后可以将该单独的表加载到 Spark 中以在后续计算中使用。
归档时间: |
|
查看次数: |
1836 次 |
最近记录: |