Pysparkで、特定のカラムの特定の文字列を削除したい
Pysparkを使って、sparkデータフレーム内の特定のカラムの特定の文字列を削除する方法です。
「Pyspark 特定の文字列 削除」と検索したが、
Pythonで文字列を削除する
一旦Pandasデータフレームに変換するといいですよ
という検索結果しか出ず「あたいはPysparkで文字が消してえんだよ」と嘆かれた方には参考になるかもしれません。
とりあえず、CSVを読み込む
#サンプルデータを定義
sample_data = [{"age": '2', 'name': '✗Alice◎'},
{"age": '5', 'name': '✗Bob◎'}]
#サンプルデータをSparkDataFrame化
df_sample = spark.createDataFrame(sample_data)
#内容確認
df_sample.show()
[結果]
+---+-------+
|age| name|
+---+-------+
| 2|✗Alice◎|
| 5| ✗Bob◎|
+---+-------+
サンプルのデータを用意し、Sparkデータフレームにしてみました。
年齢と名前という簡単なデータですが、よく見ると名前にバツ・マルという2つの不要な文字列がくっついています。
このデータのように、システムから自動で引っ張ってくると、たま〜に余計な文字列が付随してくること、ありますよね。
では、ここから邪魔なバツ・マルをPysparkのコマンドを使って削除していきたいと思います。
regexp_replaceを使う
結論、こんな感じで書くことが出来ます!
from pyspark.sql.functions import regexp_replace,col
sample_df_regex = (
sample_df
.select(
"age",
regexp_replace(col("name"),"✗","").alias("name")
)
.select(
"age",
regexp_replace(col("name"),"◎","").alias("name")
)
)
[結果]
+---+-----+
|age| name|
+---+-----+
| 2|Alice|
| 5| Bob|
+---+-----+
ここではメインとして「regexp_replace」というコマンドを使っています。
regexp_replace(col("<操作したいカラム名>"),"<削除したい文字列>","")
これをSparkデータフレームのオプション「select」内で使うことにより、削除したい文字列を空白にreplaceすることが出来る、つまり削除できるというもの。
削除するというか、空白に置換するってイメージですね!
もちろん置換なので、任意の文字列に変換することも出来るようです。
また、そのままだと操作を加えたカラムの名前が「regexp_replace(col("<操作したいカラム名>"),"<削除したい文字列>",,<カラム番号>」というヘンテコなものになってしまうので、そのあと「.alias("元のカラム名")」を使って元に戻しています。
このやり方の少し面倒なところが、一度に1文字列しか削除できないということ。
このため、バツ・マルを「✗」「◎」の二度に分けて削除しています。
これが少し面倒。Pysparkがもう少し気を利かせくれれば…
今回は以上となります。
ぜひ、上のコマンドに消したい文字列を入れて試してみてくださいね。
このシリーズの目的
クラウドストレージに蓄積された生データ(CSV,JSON等)を加工するのに必要なPysparkの知識を溜めていく、まさにPysparkに関するトリビアのDalta Lakeを目指しています。
Pysparkに関する記事はまだ海外のものが多く、このシリーズが私のような国内の駆け出しデータエンジニアの一助になることを願っています。