#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| -------