[解決済み] spark dataframe から null 値をフィルタリングする方法
2023-07-23 02:07:43
質問
sparkで以下のスキーマでdataframeを作成しました。
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)
そして、そのデータは以下のように表示されます。
+----------+----------+-------+--------+----------+-----------+---------+
| 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|
+----------+----------+-------+--------+----------+-----------+---------+
私は行が"friend_id"のフィールドにNULL値を持っていることをフィルタリングしたいです。
scala> val aaa = test.filter("friend_id is null")
scala> aaa.count
私は:res52: Long = 0を得ました、これは明らかに正しくありません。それを得るために正しい方法は何ですか?
もう一つ質問ですが、friend_idフィールドの値を置き換えたいのです。私はnullを0に、null以外の値を1に置き換えたいのです。私が考えつくコードは
val aaa = train_friend_join.select($"user_id", $"event_id", $"invited", $"day_diff", $"interested", $"event_owner", ($"friend_id" != null)?1:0)
このコードもうまくいきません。どうしたら直るのか、どなたか教えていただけませんか?ありがとうございます。
どのように解決するには?
このようなデータ設定があったとします(結果が再現できるように)。
// declaring data types
case class Company(cName: String, cId: String, details: String)
case class Employee(name: String, id: String, email: String, company: Company)
// setting up example data
val e1 = Employee("n1", null, "[email protected]", Company("c1", "1", "d1"))
val e2 = Employee("n2", "2", "[email protected]", Company("c1", "1", "d1"))
val e3 = Employee("n3", "3", "[email protected]", Company("c1", "1", "d1"))
val e4 = Employee("n4", "4", "[email protected]", Company("c2", "2", "d2"))
val e5 = Employee("n5", null, "[email protected]", Company("c2", "2", "d2"))
val e6 = Employee("n6", "6", "[email protected]", Company("c2", "2", "d2"))
val e7 = Employee("n7", "7", "[email protected]", Company("c3", "3", "d3"))
val e8 = Employee("n8", "8", "[email protected]", Company("c3", "3", "d3"))
val employees = Seq(e1, e2, e3, e4, e5, e6, e7, e8)
val df = sc.parallelize(employees).toDF
データは
+----+----+---------+---------+
|name| id| email| company|
+----+----+---------+---------+
| n1|null|[email protected]|[c1,1,d1]|
| n2| 2|[email protected]|[c1,1,d1]|
| n3| 3|[email protected]|[c1,1,d1]|
| n4| 4|[email protected]|[c2,2,d2]|
| n5|null|[email protected]|[c2,2,d2]|
| n6| 6|[email protected]|[c2,2,d2]|
| n7| 7|[email protected]|[c3,3,d3]|
| n8| 8|[email protected]|[c3,3,d3]|
+----+----+---------+---------+
では、従業員をフィルタリングするために
null
のIDで社員を絞り込むには、次のようにします。
df.filter("id is null").show
とすると、正しく次のように表示されます。
+----+----+---------+---------+
|name| id| email| company|
+----+----+---------+---------+
| n1|null|[email protected]|[c1,1,d1]|
| n5|null|[email protected]|[c2,2,d2]|
+----+----+---------+---------+
ご質問の2番目の部分についてですが、このように
null
を0に、その他の値を1に置き換えることができます。
df.withColumn("id", when($"id".isNull, 0).otherwise(1)).show
という結果になります。
+----+---+---------+---------+
|name| id| email| company|
+----+---+---------+---------+
| n1| 0|[email protected]|[c1,1,d1]|
| n2| 1|[email protected]|[c1,1,d1]|
| n3| 1|[email protected]|[c1,1,d1]|
| n4| 1|[email protected]|[c2,2,d2]|
| n5| 0|[email protected]|[c2,2,d2]|
| n6| 1|[email protected]|[c2,2,d2]|
| n7| 1|[email protected]|[c3,3,d3]|
| n8| 1|[email protected]|[c3,3,d3]|
+----+---+---------+---------+
関連
-
[解決済み] ネストした構造体をよりきれいに更新する方法
-
[解決済み] Scalaです。リスト[Future]からFuture[List]への変換は、失敗したFutureを無視する。
-
[解決済み] リスト[Option]からNoneを除外するには?
-
[解決済み] build.sbtとbuild.scalaの違いは何ですか?
-
[解決済み] Scalaです。ScalaのコレクションにおけるTraversableとIterableの違いは何ですか?
-
[解決済み] Spark Dataframeの最初の1000行を取得する方法はありますか?
-
[解決済み] Abstract ClassとTraitの違い[重複]について
-
[解決済み] Scalaにおける効率的なインデックス付き反復処理
-
[解決済み] scalaのslickメソッド、今ひとつ理解できない。
-
[解決済み] ScalaでCurryする2つの方法、それぞれのユースケースは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ネストした構造体をよりきれいに更新する方法
-
[解決済み] SBTが終了せずに実行を停止する
-
[解決済み] Scalaのパターンマッチはなぜ変数で機能しないのですか?
-
[解決済み] Scalaにおけるval-mutableとvar-immutableの比較
-
[解決済み] Scalaです。ScalaのコレクションにおけるTraversableとIterableの違いは何ですか?
-
[解決済み] なぜ `private val` と `private final val` は違うのですか?
-
[解決済み] アブストラクトオーバーとはどういう意味ですか?
-
[解決済み] 依存性注入のためのリーダーモナド:複数の依存性、ネストされた呼び出し
-
[解決済み] Scala。文字列からブール値へのエレガントな変換
-
[解決済み] Scalaの複数パラメータリストと複数パラメータ/リストの違いは何ですか?