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