2017-09-29 8 views
4

J'essaie de répliquer n fois une ligne d'un dataset et de créer un nouveau Dataset. Mais, lors de la réplication, j'ai besoin que la valeur d'une colonne soit modifiée pour chaque réplication, car elle finirait par être la clé primaire une fois stockée.Réplication d'une ligne à partir d'un dataset n fois dans Apache Spark en utilisant Java

Voici le code Scala de poste SO: Replicate Spark Row N-times

import org.apache.spark.sql.functions._ 

val result = singleRowDF 
    .withColumn("dummy", explode(array((1 until 100).map(lit): _*))) 
    .selectExpr(singleRowDF.columns: _*) 

Comment puis-je créer une colonne à partir d'un tableau de valeurs en Java et passer à exploser la fonction? Les suggestions sont utiles.

Merci

Répondre

2

C'est le programme Java pour répliquer une seule ligne d'un dataset n fois.

import static org.apache.spark.sql.functions.col; 
import static org.apache.spark.sql.functions.explode; 
import static org.apache.spark.sql.functions.lit; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.stream.IntStream; 

import org.apache.spark.sql.Dataset; 
import org.apache.spark.sql.Encoders; 
import org.apache.spark.sql.Row; 
import org.apache.spark.sql.SparkSession; 

public class SparkSample{ 
    public static void main(String[] args) { 
     SparkSession spark = SparkSession 
       .builder() 
       .appName("SparkSample") 
       .master("local[*]") 
       .getOrCreate(); 
     //Create Dataset 
     List<Tuple2<String,Double>> inputList = new ArrayList<Tuple2<String,Double>>(); 
     inputList.add(new Tuple2<String,Double>("A",1.0)); 
     Dataset<Row> df = spark.createDataset(inputList, Encoders.tuple(Encoders.STRING(), Encoders.DOUBLE())).toDF(); 
     df.show(false); 
     //Java 8 style of creating Array. You can create by using for loop as well 
     int[] array = IntStream.range(0, 5).toArray(); 
     //With Dummy Column 
     Dataset<Row> df1 = df.withColumn("dummy", explode(lit(array))); 
     df1.show(false); 
     //Drop Dummy Column 
     Dataset<Row> df2 = df1.drop(col("dummy")); 
     df2.show(false); 
    } 
} 

Voici la sortie de ce programme.

+---+---+ 
|_1 |_2 | 
+---+---+ 
|A |1.0| 
+---+---+ 

+---+---+-----+ 
|_1 |_2 |dummy| 
+---+---+-----+ 
|A |1.0|0 | 
|A |1.0|1 | 
|A |1.0|2 | 
|A |1.0|3 | 
|A |1.0|4 | 
+---+---+-----+ 

+---+---+ 
|_1 |_2 | 
+---+---+ 
|A |1.0| 
|A |1.0| 
|A |1.0| 
|A |1.0| 
|A |1.0| 
+---+---+ 
+0

Merci pour l'exemple de code! Je vais vérifier comment elle évolue pour un grand nombre de lignes (pour des millions de lignes). – Kans