Искра — взрыв и объединение столбцов

#python #apache-spark #pyspark #apache-spark-sql

Вопрос:

У меня есть данные для обработки в PySpark SQL, которые выглядят следующим образом:

  --------- ----------------  |user_id |user_ids |  --------- ----------------  |null |[479534, 1234] | |null |[1234] | |null |[479535] | |null |[479535, 479536]| |null |[1234] | |null |[479535] | |1234567 |null | |1234567 |null | |777 |null | |888 |null | |null |null |  --------- ----------------   

Мне нужен только один user_id столбец с дополнительными строками, из которых будут разнесены user_ids , так что что-то вроде этого:

  ---------  |user_id |  ---------  |479534 | |1234 | |1234 | |479535 | |479535 | |479536 | |1234 | |479535 | |1234567 | |1234567 | |777 | |888 | |null |  ---------   

Как я могу этого достичь?

Я пытался:

 .withColumn("user_ids", F.explode_outer("user_ids"))  .withColumn("user_id", F.coalesce(df["user_id"], df["user_ids"]))   

Но с этим я получаю:

 cannot resolve 'coalesce(user_id, user_ids)' due to data type mismatch: input to function coalesce should all be the same type, but it's [bigint, arraylt;bigintgt;];  

Поэтому я думаю, что withColumn в этом случае нельзя использовать другой созданный столбец.

Ответ №1:

Вы не сохраняете кадр данных после взрыва, поэтому не указывайте столбцы как df['col'] , а просто вызывайте F.col('col') . Например,

 df.withColumn('user_ids', F.explode_outer('user_ids'))  .withColumn('user_id', F.coalesce(F.col('user_id'), F.col('user_ids')))   

Вот мое испытание.

 from pyspark.sql import functions as f   df = spark.createDataFrame([[None, [479534, 1234]], [1234567, None]], ['user_id', 'user_ids']) df.show()   ------- --------------  |user_id| user_ids|  ------- --------------  | null|[479534, 1234]| |1234567| null|  ------- --------------   df.withColumn('user_ids', f.explode_outer('user_ids'))   .withColumn('user_id', f.coalesce(f.col('user_id'), f.col('user_ids')))   .drop('user_ids')   .show()   -------  |user_id|  -------  | 479534| | 1234| |1234567|  -------