comment filtrer une valeur nulle à partir de l'étincelle dataframe
J'ai créé un dataframe spark avec le schéma suivant:
root
|-- user_id: long (nullable = false)
|-- event_id: long (nullable = false)
|-- invited: integer (nullable = false)
|-- day_diff: long (nullable = true)
|-- interested: integer (nullable = false)
|-- event_owner: long (nullable = false)
|-- friend_id: long (nullable = false)
Et les données s'affichent ci-dessous:
+----------+----------+-------+--------+----------+-----------+---------+
| user_id| event_id|invited|day_diff|interested|event_owner|friend_id|
+----------+----------+-------+--------+----------+-----------+---------+
| 4236494| 110357109| 0| -1| 0| 937597069| null|
| 78065188| 498404626| 0| 0| 0| 2904922087| null|
| 282487230|2520855981| 0| 28| 0| 3749735525| null|
| 335269852|1641491432| 0| 2| 0| 1490350911| null|
| 437050836|1238456614| 0| 2| 0| 991277599| null|
| 447244169|2095085551| 0| -1| 0| 1579858878| null|
| 516353916|1076364848| 0| 3| 1| 3597645735| null|
| 528218683|1151525474| 0| 1| 0| 3433080956| null|
| 531967718|3632072502| 0| 1| 0| 3863085861| null|
| 627948360|2823119321| 0| 0| 0| 4092665803| null|
| 811791433|3513954032| 0| 2| 0| 415464198| null|
| 830686203| 99027353| 0| 0| 0| 3549822604| null|
|1008893291|1115453150| 0| 2| 0| 2245155244| null|
|1239364869|2824096896| 0| 2| 1| 2579294650| null|
|1287950172|1076364848| 0| 0| 0| 3597645735| null|
|1345896548|2658555390| 0| 1| 0| 2025118823| null|
|1354205322|2564682277| 0| 3| 0| 2563033185| null|
|1408344828|1255629030| 0| -1| 1| 804901063| null|
|1452633375|1334001859| 0| 4| 0| 1488588320| null|
|1625052108|3297535757| 0| 3| 0| 1972598895| null|
+----------+----------+-------+--------+----------+-----------+---------+
Je veux filtrer les lignes ont des valeurs null dans le domaine de la "friend_id".
scala> val aaa = test.filter("friend_id is null")
scala> aaa.count
J'ai eu :res52: Long = 0 ce qui est évident n'est pas le droit. Quelle est la bonne façon de l'obtenir?
Encore une question, je veux remplacer les valeurs dans la friend_id champ. Je veux remplacer null par 0 et 1 pour toute autre valeur différente de null. Le code je peux le comprendre est:
val aaa = train_friend_join.select($"user_id", $"event_id", $"invited", $"day_diff", $"interested", $"event_owner", ($"friend_id" != null)?1:0)
Ce code ne fonctionne pas. Quelqu'un peut-il me dire comment puis-je résoudre ce problème? Grâce
- friend_id: longue (nullable = false) ?? comment se fait-vous avez les valeurs null? sont-ils vraiment des valeurs null ou texte ?
- où êtes-vous de lire les données à partir de ?
- Salut Zahiro Mor, les valeurs null sont à partir d'une jointure externe gauche de l'étape précédente que je n'ai pas présents ici. Désolé
Vous devez vous connecter pour publier un commentaire.
Disons que vous avez ces données de configuration (de sorte que les résultats sont reproductibles):
Des données est:
Maintenant pour filtrer les employés avec
null
identifiants, vous fera --qui feront de vous montrer suivantes:
Venir à la deuxième partie de votre question, vous pouvez remplacer le
null
id avec des 0 et des autres valeurs avec 1 avec cela -Il en résulte:
Ou comme
df.filter($"friend_id".isNotNull)
Une bonne solution pour moi a été de laisser tomber les lignes avec toutes les valeurs null:
Dataset<Row> filtered = df.filter(row => !row.anyNull());
Dans le cas où l'on est intéressé dans les autres cas, il suffit d'appeler
row.anyNull()
.(Spark 2.1.0 à l'aide de l'API Java)
Il y a deux façons de le faire: la création de l'état du filtre 1) Manuellement 2) Dynamiquement.
Exemple de DataFrame:
1) la Création de l'état du filtre manuellement c'est à dire à l'aide de DataFrame
where
oufilter
fonctionou
Résultat:
2) la Création de l'état du filtre dynamiquement: Cette option est utile lorsque nous ne voulons pas n'importe quelle colonne pour avoir la valeur null et il ya un grand nombre de colonnes, ce qui est souvent le cas.
Pour créer la condition de filtre manuellement dans de tels cas, les déchets beaucoup de temps. Dans le code ci-dessous nous sommes, y compris toutes les colonnes dynamiquement à l'aide de
map
etreduce
fonction DataFrame colonnes:Comment
filterCond
ressemble:De filtrage:
Résultat:
À partir de l'indice de Michael Kopaniov, ci-dessous fonctionne
Voici une solution pour spark en Java. Pour sélectionner des lignes de données contenant les valeurs null. Lorsque vous avez des données de Dataset, vous n':
Pour filtrer les données sans les valeurs null, vous n':
Souvent dataframes contiennent des colonnes de type Chaîne de caractères où, au lieu de la valeur null nous avons des chaînes vides comme "". Pour filtrer ces données ainsi nous n':
pour la première question, il est correct, vous êtes en filtrant les valeurs null et donc de comptage est égale à zéro.
pour la deuxième remplacement: utiliser comme ci-dessous:
J'utilise le code suivant pour résoudre ma question. Elle fonctionne. Mais comme nous le savons tous, je travaille autour d'un pays mile pour le résoudre. Alors, est-il un raccourci pour qui? Grâce