Je suis nouveau dans Spark et je dois masquer les numéros de carte de crédit présents dans un Dataframe Spark où les quatre derniers chiffres ne sont affichés que. Comment faire cela?
Voici mon tableau
+----------+------------+ |first_name| card| +----------+------------+ | abc|********9999| | lmn|********2222| +----------+------------+
Résultat attendu:
+----------+------------+ |first_name| card| +----------+------------+ | abc|999999999999| | lmn|222222222222| +----------+------------+
4 Réponses :
Seq("123456789").toDF() .select(concat(lit("********"),regexp_extract('value',".{4}$",0)).as("card")) .show() +------------+ | card| +------------+ |********6789| +------------+
une autre alternative -
df.withColumn("masked_cc", expr("concat(translate(left(card, length(card)-4), '0123456789', '**********')," + "right(card, 4))")) .show(false) /** * +----------+------------+------------+ * |first_name|card |masked_cc | * +----------+------------+------------+ * |abc |999999999999|********9999| * |lmn |222222222222|********2222| * +----------+------------+------------+
Dans pyspark, vous pouvez également utiliser la fonction de sous-chaîne
from pyspark.sql.types import * tst= sqlContext.createDataFrame([("name1",9999999999),("name2",2222222222)],schema=['name','number']) # This is assuming your card number is not a string. If not skip this cast tst_cast = tst.withColumn("number_string",F.col('number').cast(StringType())) tst_mask = tst_cast.withColumn("masked_number",F.concat(F.lit('******'),F.substring(F.col("number_string"),6,4)))
Vous pouvez utiliser sous-chaîne et lpad ensemble pour générer un comportement similaire,
df.selectExpr("lpad(substring(card,length(card)-4,4),16,'*') as card").show() +----------------+ | card| +----------------+ |************9999| +----------------+