3 votes

Comment utiliser split dans pyspark

J'ai besoin de diviser sd_phonenumber sur la base de ".", j'ai besoin de deux colonnes :

sd_phone|          phone|sd_phonenumber|
+--------+---------------+--------------+
|       1| 44 7723 466844| 44.7723466844|
|        |   646-821-1444|    6468211444|
|        |   405-455-5941|    4054555941|
|       1|886-4-2359-5958| 88.6423595958|
|       1|+1 973-340-9100|  1.9733409100|
|        |   046-23 45 50|          null|
|        |   559-374-2385|    5593742385|
|        |  +507 395 3560|    5073953560|
|        |   650-727-4950|    6507274950|

Par exemple : 44.7723466844

col1    col2  
44     7723466844 

Jusqu'à présent, j'ai essayé :

 df_phone_cc=df_phone.with column("sd_phone", split(col("sd_phonenumber"), ".").getItem(0))
 df_phone_cc=df_phone.withColumn("sd_phone" ,split_col.getItem(1))

J'obtiens null pour l'ensemble des colonnes sd_phone. Est-ce que quelqu'un peut m'aider ?

2voto

LAM HeiHung Points 49

Puisque vous avez déjà obtenu le poste 0 lors de votre première .withColumn() les sd_phone si vous voulez créer respectivement les colonnes col1 et col2, vous devez d'abord stocker votre colonne de tableau :

df_phone_cc = df_phone.withColumn("new_col", split(col("sd_phonenumber"), "."))
df_phone_cc = df_phone_cc.withColumn("col1", col("new_col").getItem(0))
df_phone_cc = df_phone_cc.withColumn("col2", col("new_col").getItem(1))

1voto

wwnde Points 14457

Dans les scripts, la logique est aussi importante que le code. Ici, je préfixe les nombres qui n'ont pas de point avec 0. et la stocker dans une nouvelle colonne. Je divise la nouvelle colonne avec . et l'enregistrer dans la colonne StructType de pysparks. J'utilise inline pour envoyer chaque élément de la colonne struct dans sa propre colonne.

Code

df_phone_cc=(
  #Where there is no dot, introduce 0. and store in col new_sd_phonenumber
  df_phone.withColumn("new_sd_phonenumber", when(col('sd_phonenumber').rlike('\.'),col('sd_phonenumber')).otherwise(concat_ws('.', F.lit('0'), col('sd_phonenumber'))))
  #Split col new_sd_phonenumber by dot and save as Struct column
  .withColumn("new_sd_phonenumber",F.array(F.struct(*[split(col("new_sd_phonenumber"), "\.")[i].alias(f"phone{i+1}")for i in range(2)])))
  #Select all the columns
  .selectExpr('sd_phone','phone','sd_phonenumber','inline(new_sd_phonenumber)')).show()

Sortie

+--------+---------------+--------------+------+----------+
|sd_phone|          phone|sd_phonenumber|phone1|    phone2|
+--------+---------------+--------------+------+----------+
|       1| 44 7723 466844| 44.7723466844|    44|7723466844|
|       1|   646-821-1444|    6468211444|     0|6468211444|
|       1|   405-455-5941|    4054555941|     0|4054555941|
|       1|886-4-2359-5958| 88.6423595958|    88|6423595958|
+--------+---------------+--------------+------+----------+

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X