PySpark備忘録
実現したいこと
緯度経度に匿名加工を施したい
ただし、匿名加工に関しての手法としては特段難しいことをしているのではなく
最後の3桁ほどを"000"としたい程度
小数点は13位まで
緯度経度の撮りうる値としては以下が考えられる
- 1.2345678910111
- 123.4567891011121
これを上記に従って下3桁を"000"とした場合 - 1.2345678910000
- 123.4567891011000
となって欲しい
考えられるコード
sample.py
"""
Python, Pandasで行う場合のサンプルコード
ただしconvert関数の挙動の確認はしていないのでこんな感じの処理が行いたいんだな程度での認識
"""
import pandas as pd
def convert(longitude_latitude):
longitude_latitude = str(longitude_latitude)[0: -3] + "000"
return longitude_latitude
df = pd.read_csv(file_path)
df["longitude"] = df["longitude"].apply(convert)
df["latitude"] = df["latitude"].apply(convert)
試したコード
spark.py
df_result = df_input\
.select(
F.concat(F.col("latitude").substr(1, 12), F.lit("000")).alias("latitude"),
F.concat(F.col("longitude").substr(1, 12), F.lit("000")).alias("longitude")
)
この処理を行うとこのように変換されてしまう
- 1.2345678910111→1.2345678910000
- 123.4567891011121→123.45678910000
つまり桁数が足りない
小数点以下の対応
spark.py
df_result = df_input\
.select(
F.concat(F.col("latitude").substr(-13, 10)).alias("after_the_decimal_point_not_anonymized")
)
こうすることで
- 1.2345678910111→2345678910
- 123.4567891011121→4567891011
が取得できる
実現できるコード
spark.py
df_result = df_input\
.select(
F.concat(
F.split("latitude", "[.]")[0],
F.lit("."),
F.concat(F.col("latitude").substr(-13, 10)),
F.lit("000")
).alias("latitude_mask")
)