LoginSignup
1
0

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-03-31

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

1
0
0

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
  3. You can use dark theme
What you can do with signing up
1
0