Выбор значений из непустых столбцов в элементе данных PySpark DataFrame

Существует блок данных pyspark с отсутствующими значениями:

tbl = sc.parallelize([ Row(first_name='Alice', last_name='Cooper'), Row(first_name='Prince', last_name=None), Row(first_name=None, last_name='Lenon') ]).toDF() tbl.show() 

Вот таблица:

  +----------+---------+ |first_name|last_name| +----------+---------+ | Alice| Cooper| | Prince| null| | null| Lenon| +----------+---------+ 

Я хотел бы создать новый столбец следующим образом:

  • если имя не указано None, введите фамилию
  • если фамилия None, введите имя
  • если они оба присутствуют, соедините их
  • мы можем с уверенностью предположить, что присутствует хотя бы один из них

Я могу построить простую функцию:

 def combine_data(row): if row.last_name is None: return row.first_name elif row.first_name is None: return row.last_name else: return '%s %s' % (row.first_name, row.last_name) tbl.map(combine_data).collect() 

Я получаю правильный результат, но я не могу добавить его в таблицу как столбец: tbl.withColumn('new_col', tbl.map(combine_data)) приводит к AssertionError: col should be Column

Каков наилучший способ преобразования результата map в Column ? Есть ли предпочтительный способ устранения null значений?

  • Вычислить режим колонки PySpark DataFrame?
  • Как сгруппировать по нескольким клавишам в искру?
  • Составная функция PySpark
  • Может только zip с RDD, у которого одинаковое количество ошибок раздела
  • Создать программный объект в Spark ML / pyspark
  • Взорвать в PySpark
  • Что эквивалентно scala.util.Try в pyspark?
  • Запись PySpark у исполнителя
  • 2 Solutions collect form web for “Выбор значений из непустых столбцов в элементе данных PySpark DataFrame”

    Вам просто нужно использовать UDF, который получает два columns качестве аргументов.

     from pyspark.sql.functions import * from pyspark.sql import Row tbl = sc.parallelize([ Row(first_name='Alice', last_name='Cooper'), Row(first_name='Prince', last_name=None), Row(first_name=None, last_name='Lenon') ]).toDF() tbl.show() def combine(c1, c2): if c1 != None and c2 != None: return c1 + " " + c2 elif c1 == None: return c2 else: return c1 combineUDF = udf(combine) expr = [c for c in ["first_name", "last_name"]] + [combineUDF(col("first_name"), col("last_name")).alias("full_name")] tbl.select(*expr).show() #+----------+---------+------------+ #|first_name|last_name| full_name| #+----------+---------+------------+ #| Alice| Cooper|Alice Cooper| #| Prince| null| Prince| #| null| Lenon| Lenon| #+----------+---------+------------+ 

    Как всегда лучше работать непосредственно с собственным представлением, а не получать данные на Python:

     from pyspark.sql.functions import concat_ws, coalesce, lit, trim def combine(*cols): return trim(concat_ws(" ", *[coalesce(c, lit("")) for c in cols])) tbl.withColumn("foo", combine("first_name", "last_name")). 
    Python - лучший язык программирования в мире.