2017-10-10 1 views
0

JeApache Spark - Sélection des champs non modifiés d'une rangée dans dataframe

org.apache.spark.sql.DataFrame = [ts: string, name: string, value: string ] 

et je suis en train de faire

val result = df.map {case Row(ts, name, value) => (name+":"+value+"-ctag", ts)} 

champ essentiellement 2ème le résultat est non modifié. Cependant, je reçois cette erreur:

java.lang.ClassNotFoundException: scala.Any 
    at scala.reflect.internal.util.AbstractFileClassLoader.findClass(AbstractFileClassLoader.scala:62) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:348) 
    at scala.reflect.runtime.JavaMirrors$JavaMirror.javaClass(JavaMirrors.scala:555) 
    at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$classToJava$1.apply(JavaMirrors.scala:1211) 
    at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$classToJava$1.apply(JavaMirrors.scala:1203) 
    at scala.reflect.runtime.TwoWayCaches$TwoWayCache$$anonfun$toJava$1.apply(TwoWayCaches.scala:49) 

Si je ne sélectionne pas le 2ème champ tel qu'il est, mais applique une transformation comme ci-dessous

val result = df.map {case Row(ts, name, value) => (name+":"+value+"-ctag", ts+"test")} 

cela fonctionne sans aucun problème.

Pouvez-vous expliquer ce que cette erreur dit? Je voudrais appliquer la transformation sur certains champs et pas sur d'autres domaines.

Répondre

0

Si vous appliquez un modèle sur , toutes vos variables sont de type Any. Si vous concaténez un Any avec un String, le résultat est String (c'est le cas dans votre deuxième exemple).

Essayez ceci:

val result = df.map {case Row(ts:String, name:String, value:String) => (name+":"+value+"-ctag", ts)} 
+0

parfait, cela a fonctionné !! Merci beaucoup. –