Удаление строк во вложенной структуре в фрейме данных spark с использованием PySpark (подробности в тексте) - PullRequest
1 голос
/ 29 апреля 2020

Я использую pyspark и у меня есть объект dataframe df, и вот как выглядит вывод df.printSchema()

root
 |-- M_MRN: string (nullable = true)
 |-- measurements: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- Observation_ID: string (nullable = true)
 |    |    |-- Observation_Name: string (nullable = true)
 |    |    |-- Observation_Result: string (nullable = true)

Я хотел бы отфильтровать все массивы в «измерениях» где Observation_ID не является «5» или «10». Поэтому в настоящее время, когда я запускаю df.select('measurements').take(2), я получаю

[Row(measurements=[Row(Observation_ID='5', Observation_Name='ABC', Observation_Result='108/72'),
                   Row(Observation_ID='11', Observation_Name='ABC', Observation_Result='70'),
                   Row(Observation_ID='10', Observation_Name='ABC', Observation_Result='73.029'),
                   Row(Observation_ID='14', Observation_Name='XYZ', Observation_Result='23.1')]),
 Row(measurements=[Row(Observation_ID='2', Observation_Name='ZZZ', Observation_Result='3/4'),
                   Row(Observation_ID='5', Observation_Name='ABC', Observation_Result='7')])]

Мне бы хотелось, чтобы после выполнения вышеупомянутой фильтрации и запуска df.select('measurements').take(2) я получил

[Row(measurements=[Row(Observation_ID='5', Observation_Name='ABC', Observation_Result='108/72'),
                   Row(Observation_ID='10', Observation_Name='ABC', Observation_Result='73.029')]),
 Row(measurements=[Row(Observation_ID='5', Observation_Name='ABC', Observation_Result='7')])]

Есть ли способ сделать это в pyspark? Спасибо в ожидании вашей помощи!

1 Ответ

1 голос
/ 29 апреля 2020

Начиная с Spark 2.4, вы можете использовать функцию высшего порядка FILTER для фильтрации элементов из массива. Поэтому, если вы хотите удалить элементы, где Observation_ID не 5 или 10, вы можете сделать это следующим образом:

from pyspark.sql.functions import expr

df.withColumn('measurements', expr("FILTER(measurements, x -> x.Observation_ID = 5 OR x.Observation_ID = 10)"))
...