0
votes

Comment filtrer correctement la colonne avec des données séparées par une virgule?

Disons que j'ai un tel Dataframe.

+-----------+
|amount     |
+-----------+
|73         |
+-----------+


2 commentaires

Pouvez-vous partager le schéma de votre Dataframe?


Eh bien, le type de données du montant est StringTtType .


4 Réponses :


3
votes

Split La colonne dans une matrice de chaînes, intersect avec une colonne littérale de valeurs que vous devez filtrer, puis vérifier si la taille de résultat est plus grande que zéro: < Pré> xxx


3 commentaires

Quel type d'importation utilisez-vous pour array_intersect ? J'ai essayé d'utiliser une telle importation importer org.apache.park.sql.functions ._ mais il ne peut pas résoudre le symbole aray_intersect.


Vous devriez mentionner que array_intersect est uniquement disponible pour Spark 2.4+


Malheureusement, dans mon cas, j'utilise Spark 2.3.3 .



1
votes

Le ISIN Méthode, comparez la version exacte de la chaîne latérale gauche avec une éventail de valeurs de droite. Le problème dans votre cas est, il a essayé de comparer la chaîne "100 200 300" avec chaîne "200", évidemment, elle ne correspondra pas.

Un moyen de résoudre le problème consiste à exploser la colonne String Split par virgade et ensuite faire Appliquez la méthode ISIN sur la colonne éclatée que cela fonctionnera. xxx


2 commentaires

Merci pour votre réponse. Le nom explosé peut-il être identique à celui de la colonne d'origine montant ? Je ne veux pas produire de colonnes.


@Nurzhannogerbek Vous pouvez déposer la colonne éclatée et continuer votre colonne existante. J'ai mis à jour la réponse.



0
votes

Si vous avez Spark 2.4+, utilisez des fonctions de tableau tels que array_intersect , sinon utilisez udf: xxx


0 commentaires

3
votes

Si vous ne pouvez pas utiliser Spark 2.4, voici un autre moyen d'utiliser array_contains code> et Split code> Fonctions.

First Split la colonne Montant Code> Pour obtenir la colonne Array: P>

val filterExpr = array.map(v => array_contains($"amount_array", v)).reduce(_ or _)

df2.filter(filterExpr).drop("amount_array").show()

//+-----------+
//|     amount|
//+-----------+
//|100,200,300|
//|         73|
//+-----------+


0 commentaires