Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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数据集<;世界其他地区>;使用java_Java_Apache Spark - Fatal编程技术网

将索引列添加到apache spark数据集<;世界其他地区>;使用java

将索引列添加到apache spark数据集<;世界其他地区>;使用java,java,apache-spark,Java,Apache Spark,下面的问题提供了scala和pyspark的解决方案,而本问题中提供的解决方案不适用于连续索引值 我在ApacheSpark中有一个现有的数据集,我想根据索引从中选择一些行。我计划添加一个包含从1开始的唯一值的索引列,并基于该列的值获取行。 我找到了以下方法来添加使用order by的索引: df.withColumn("index", functions.row_number().over(Window.orderBy("a column"))); 我不想按顺序使用。我需要索引的顺序与它们

下面的问题提供了scala和pyspark的解决方案,而本问题中提供的解决方案不适用于连续索引值

我在ApacheSpark中有一个现有的数据集,我想根据索引从中选择一些行。我计划添加一个包含从1开始的唯一值的索引列,并基于该列的值获取行。 我找到了以下方法来添加使用order by的索引:

df.withColumn("index", functions.row_number().over(Window.orderBy("a column")));

我不想按顺序使用。我需要索引的顺序与它们在数据集中的顺序相同。有什么帮助吗?

根据我收集的信息,您正在尝试向数据帧添加索引(具有连续值)。不幸的是,在Spark中没有内置函数可以做到这一点。您只能使用df.withColumn(“index”,
单调递增索引ID
)添加递增索引(但不一定是连续值)

尽管如此,RDDAPI中仍然存在一个
zipWithIndex
函数,它完全满足您的需要。因此,我们可以定义一个函数,将数据帧转换为RDD,添加索引并将其转换回数据帧

我不是java中spark的专家(scala更紧凑),所以可能做得更好。我会这样做的

public static Dataset<Row> zipWithIndex(Dataset<Row> df, String name) {
    JavaRDD<Row> rdd = df.javaRDD().zipWithIndex().map(t -> {
        Row r = t._1;
        Long index = t._2 + 1;
        ArrayList<Object> list = new ArrayList<>();
        r.toSeq().iterator().foreach(x -> list.add(x));
        list.add(index);
        return RowFactory.create(list);
    });
    StructType newSchema = df.schema()
            .add(new StructField(name, DataTypes.LongType, true, null));
    return df.sparkSession().createDataFrame(rdd, newSchema);
}

上面的答案对我有一些调整。下面是一个功能性Intellij暂存文件。我在Spark 2.3.0上:

import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.functions;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.Metadata;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;

import java.util.ArrayList;

class Scratch {
    public static void main(String[] args) {
        SparkSession spark = SparkSession
                    .builder()
                    .appName("_LOCAL")
                    .master("local")
                    .getOrCreate();
        Dataset<Row> df = spark.range(5)
                .withColumn("index1", functions.monotonicallyIncreasingId());
        Dataset<Row> result = zipWithIndex(df, "good_index");
        result.show();
    }
    public static Dataset<Row> zipWithIndex(Dataset<Row> df, String name) {
        JavaRDD<Row> rdd = df.javaRDD().zipWithIndex().map(t -> {
            Row r = t._1;
            Long index = t._2 + 1;
            ArrayList<Object> list = new ArrayList<>();
            scala.collection.Iterator<Object> iterator = r.toSeq().iterator();
            while(iterator.hasNext()) {
                Object value = iterator.next();
                assert value != null;
                list.add(value);
            }
            list.add(index);
            return RowFactory.create(list.toArray());
        });
        StructType newSchema = df.schema()
                .add(new StructField(name, DataTypes.LongType, true, Metadata.empty()));
        return df.sparkSession().createDataFrame(rdd, newSchema);
    }
}

可能与我用Java重写的答案重复。让我知道它是否有效。另外,我不认为这是重复的,因为Java中的答案完全不同,而且更详细。
import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.functions;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.Metadata;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;

import java.util.ArrayList;

class Scratch {
    public static void main(String[] args) {
        SparkSession spark = SparkSession
                    .builder()
                    .appName("_LOCAL")
                    .master("local")
                    .getOrCreate();
        Dataset<Row> df = spark.range(5)
                .withColumn("index1", functions.monotonicallyIncreasingId());
        Dataset<Row> result = zipWithIndex(df, "good_index");
        result.show();
    }
    public static Dataset<Row> zipWithIndex(Dataset<Row> df, String name) {
        JavaRDD<Row> rdd = df.javaRDD().zipWithIndex().map(t -> {
            Row r = t._1;
            Long index = t._2 + 1;
            ArrayList<Object> list = new ArrayList<>();
            scala.collection.Iterator<Object> iterator = r.toSeq().iterator();
            while(iterator.hasNext()) {
                Object value = iterator.next();
                assert value != null;
                list.add(value);
            }
            list.add(index);
            return RowFactory.create(list.toArray());
        });
        StructType newSchema = df.schema()
                .add(new StructField(name, DataTypes.LongType, true, Metadata.empty()));
        return df.sparkSession().createDataFrame(rdd, newSchema);
    }
}
+---+------+----------+
| id|index1|good_index|
+---+------+----------+
|  0|     0|         1|
|  1|     1|         2|
|  2|     2|         3|
|  3|     3|         4|
|  4|     4|         5|
+---+------+----------+