Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark PHOENIX SPARK-加载表作为数据帧_Apache Spark_Dataframe_Phoenix - Fatal编程技术网

Apache spark PHOENIX SPARK-加载表作为数据帧

Apache spark PHOENIX SPARK-加载表作为数据帧,apache-spark,dataframe,phoenix,Apache Spark,Dataframe,Phoenix,我已经从一个HBase表(PHOENIX)创建了一个数据帧,它有5亿行。从数据框架中,我创建了一个JavaBean的RDD,并使用它与文件中的数据连接 Map<String, String> phoenixInfoMap = new HashMap<String, String>(); phoenixInfoMap.put("table", tableName); phoenixInfoMap.put("zkUrl", zkURL); DataFrame df = sql

我已经从一个HBase表(PHOENIX)创建了一个数据帧,它有5亿行。从数据框架中,我创建了一个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"));
    }
});
Map phoenixInfoMap=newhashmap();
phoenixInfoMap.put(“表”,表名);
phoenixInfoMap.put(“zkUrl”,zkUrl);
DataFrame df=sqlContext.read().format(“org.apache.phoenix.spark”).options(phoenixInfoMap.load();
JavaRDD tableRows=df.toJavaRDD();
javapairrddbdata=tableRows.mapToPair(
新PairFunction()
{
@凌驾
公共Tuple2调用(行)引发异常
{
返回新的Tuple2(row.getAs(“ID”)、row.getAs(“NAME”);
}
});
现在我的问题是,假设该文件有200万个与表匹配的唯一条目。是将整个表作为RDD加载到内存中,还是仅将表中匹配的200万条记录作为RDD加载到内存中?

您的语句

DataFrame df = sqlContext.read().format("org.apache.phoenix.spark").options(phoenixInfoMap)
.load();
将整个表加载到内存中。您还没有为phoenix提供任何过滤器,以便将其下推到hbase中,从而减少读取的行数

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

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

这种方法的基本原理是将计算转移到数据中。大部分数据驻留在HBase中,因此将小数据(文件中的id)移动到HBase中


我不太熟悉Phoenix,只是它在hbase之上提供了一个sql层。那么它大概能够进行这样的连接并将结果存储在一个单独的HBase表中。。?然后,可以将单独的表加载到Spark中,以便在后续计算中使用。

Thank you@javadba。有没有一种有效的方法来处理这种情况?我只想从HBase table.Hi@Mohan加载文件中的200万个匹配项。请告诉我
DataFrame df=sqlContext.read().format(“org.apache.phoenix.spark”).options(phoenixInfoMap.load()
方法的构建依赖关系。我也在做同样的事情,但是得到了
java.lang.NoSuchMethodError