2017-10-04 11 views
1

J'essaie d'utiliser la fonction de mappe de données sur un jeu de données arbitraire. Cependant, je ne comprends pas comment vous mapperiez à partir de Row-> Row. Aucun exemples sont donnés pour des données arbitraires dans la documentation sql étincelle:Utilisation de la mappe sur l'ensemble de données avec des lignes arbitraires dans Spark SQL

Dataset<Row> original_data = ... 
Dataset<Row> changed_data = original_data.map(new MapFunction<Row,Row>{ 
      @Override 
      public Row call(Row row) throws Exception { 
       Row newRow = RowFactory.create(obj1,obj2); 
       return newRow; 
      } 
}, Encoders.bean(Row.class)); 

Toutefois, cela ne fonctionne pas car il doit y avoir une sorte de codeur? Comment puis-je mapper vers une ligne générique?

+0

ce qui est le type de obj1 et obj2? est-ce le type de données primitif? –

+0

Map est plus une fonction RDD, avec Spark SQL vous devriez essayer d'utiliser "select" et "avec colonne" ... Et si vous en avez l'occasion, vous devriez essayer de le coder dans Scala, c'est plus facile ... – Victor

Répondre

1

Si obj1 et et obj2 ne sont pas de type primitif, alors représentez leur schéma à StructType pour créer un encodeur Row. Je suggère au lieu d'utiliser le type de ligne, créer un bean personnalisé qui stocke à la fois obj1 et obj2 puis utiliser ce codeur bean personnalisé dans la transformation map.

Type de ligne:

StructType customStructType = new StructType(); 
     customStructType = customStructType.add("obj1", DataTypes.< type>, false); 
     customStructType = customStructType.add("obj2", DataTypes.<type>, false); 
     ExpressionEncoder<Row> customTypeEncoder = null; 

     Dataset<Row> changed_data = original_data.map(row->{ 
      return RowFactory.create(obj1,obj2);; 
    }, RowEncoder.apply(customStructType)); 

sur mesure Type Bean:

class CustomBean implements ....{ 
    Object obj1; 
    Object obj2; 
.... 
} 

Dataset<CustomBean> changed_data = original_data.map(row->{ 
       return new CustomBean(obj1,obj2); 
     }, Encoders.bean(CustomBean));