Pysparkで、邪魔なゼロを消したい
ゼロパディングというのをご存知でしょうか。桁数が違うデータを、任意の数までゼロで埋めて桁数を揃えてやる、アレです。
サンプルのデータはこんな感じ。
sample_data = [{'name': 'Alice',"age": '0002',},
{'name': 'Bob',"age": '0050'}]
df = spark.createDataFrame(sample_data)
df.show()
【結果】
+----+-----+
| age| name|
+----+-----+
|0002|Alice|
|0050| Bob|
+----+-----+
2歳のアリスちゃんと、50歳のボブおじいさんという2列のごく簡単なSparkデータフレーム。
よく見ると、それぞれの年齢がゼロで埋められて4桁に統一されています。
これをPysparkで解除するなら、どうしましょうか。
単なる「ゼロ削除」ではダメ
「ゼロを消せばいいじゃん」と、前回の記事と同じコマンドを使うと…
df_remove0 = (
df
.select(
age,
regexp_replace(col("age"),"0","").alias("age_remove"),
"name"
)
)
df_remove0.show()
【結果】
+----+----------+-----+
| age|age_remove| name|
+----+----------+-----+
|0002| 2|Alice|
|0050| 5| Bob|
+----+----------+-----+
ボブおじいさんが5歳のボブくんになってしまうんです。残したい文字列に含まれるゼロも含めて削除されるのですね。
regexp_replace('対象カラム', r'^[0]*', '')を使う
結論、こんな感じで書くことが出来ます!
from pyspark.sql.functions import regexp_replace,col
df_remove_zeropadding = df.select(
"age",
regexp_replace('age', r'^[0]*', '').alias('age_regex_zero'),
"name")
df_remove_zeropadding.show()
【結果】
+----+--------------+-----+
| age|age_regex_zero| name|
+----+--------------+-----+
|0002| 2|Alice|
|0050| 50| Bob|
+----+--------------+-----+
期待通り、2歳は2歳で出力されるのはもちろん、50歳も50歳のまま表示されました。
これも#1と同じく、dfのオプションの.select,.withcolumn内で
regexp_replace('<操作したいカラム名>>', r'^[0]*', '')
を行うことで出来ます。
regexp_replace、本当に便利です!
【参考記事】
このシリーズの目的
クラウドストレージに蓄積された生データ(CSV,JSON等)を加工するのに必要なPysparkの知識を溜めていく、まさに「Pysparkに関するトリビアのDalta Lake」を目指しています。
Pysparkに関する記事はまだ海外のものが多く、このシリーズが私のような国内の駆け出しデータエンジニアの一助になることを願っています。