search
LoginSignup
0

posted at

updated at

【トリビアのDelta Lake】#2 Pysparkでゼロパディングを解除する

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に関する記事はまだ海外のものが多く、このシリーズが私のような国内の駆け出しデータエンジニアの一助になることを願っています。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0