2017-03-03 3 views
1

J'ai récemment commencé à utiliser avec Spark et Java. J'expérimente actuellement des transformations et des actions RDD. Pour l'instant je lis des données d'un csv qui contient des champs DateTime et puis j'applique un filtre pour garder seulement les lignes qui sont plus jeunes que 2 jours et finalement je vérifie si le RDD qui en résulte est vide. J'ai écrit un extrait simple qui fait ce que je veux sur un niveau minimal.Comment définir la transformation Spark RDD avec la fonction non-lambda

Function<List<String>, Boolean> filterPredicate = row -> new DateTime(row.get(1).isAfter(dtThreshold); 

sc.textFile(inputFilePath) 
      .map(text -> Arrays.asList(text.split(","))) 
      .filter(filterPredicate) 
      .isEmpty(); 

Dans ce cas simple, j'ai supposé que les objets DateTime se trouvent toujours dans la première colonne. Je veux maintenant développer cela pour utiliser plusieurs index de colonnes. Mais pour cela, j'ai besoin de pouvoir définir une fonction de prédicat avec plus d'une ligne. C'est la raison pour laquelle j'ai séparé la définition de fonction de prédicat du code de transformation.

Comment je suis supposé définir une telle fonction?

Répondre

2

Utilisez la notation accolade ...

Function<List<String>, Boolean> filterPredicate = row -> { 
     boolean isDateAfter = new DateTime(row.get(1)).isAfter(dtThreshold); 
     boolean hasName = row.get(2) != ""; 
     return isDateAfter && hasName; 
    } 
+1

cool, merci fixe – Brad