Самый быстрый и эффективный способ итерации большого набора данных в Java Spark - PullRequest
0 голосов
/ 19 января 2019

Я конвертирую набор искровых данных в список хэш-карт, используя следующий подход, Моя конечная цель - создать список объектов json или список хэш-карт. Я выполняю этот код на 3,2 миллиона строк

List<HashMap> finalJsonMap = new ArrayList<HashMap>();
    srcData.foreachPartition(new ForeachPartitionFunction<Row>() {
        public void call(Iterator<Row> t) throws Exception {
            while (t.hasNext()){
                Row eachRow = t.next();
                HashMap rowMap = new HashMap();
                for(int j = 0; j < grpdColNames.size(); j++) {
                    rowMap.put(grpdColNames.get(j), eachRow.getString(j));  
                }
                finalJsonMap.add(rowMap);
            }
        }
    });

Итерация работает нормально, но я не могу добавить rowMap в finalJsonMap.

Как лучше всего это сделать?

1 Ответ

0 голосов
/ 22 января 2019

Это действительно не так, как работает Spark.

Код, введенный в foreachPartition, выполняется в ином контексте, чем исходный

List<HashMap> finalJsonMap = new ArrayList<HashMap>();

Все, что вы можете сделать в такой настройке, - это изменить локальное копирование.

Это многократно обсуждалось при переполнении стека и подробно описано в официальной документации в разделе «Общие сведения о замыканиях» .

С учетом требуемого результата (т. Е. Локальной коллекции) на самом деле вы ничего не можете сделать, кроме как преобразовать свой код в mapPartitions и collect.Однако это вряд ли эффективно или идиоматично в Spark.

Я бы настоятельно рекомендовал переосмыслить ваш текущий дизайн.

...