Как сделать, чтобы значения вложенного поля были нулевыми в PySpark? - PullRequest
0 голосов
/ 25 сентября 2018

Рассмотрим следующую схему:

root
 |-- A: string (nullable = true)
 |-- B: string (nullable = true)
 |-- C: string (nullable = true)
 |-- D: struct (nullable = true)
 |    |-- d1: struct (nullable = true)
 |    |    |-- timestamp: string (nullable = true)
 |    |    |-- timeZoneType: string (nullable = true)
 |    |    |-- zoneName: string (nullable = true)
 |    |-- d2: string (nullable = true)
 |    |-- d3: string (nullable = true)
 |-- E: array (nullable = true)
 |    |-- e1: struct (nullable = true)
 |    |    |-- transactionId: string (nullable = true)
 |    |    |-- timeStamp: string (nullable = true)
 |    |    |-- instanceId: string (nullable = true)
 |    |    |-- userId: string (nullable = true)
 |    |    |-- reason: string (nullable = true)
 |    |-- e2: array (nullable = true)
 |    |    |-- transactionId: string (nullable = true)
 |    |    |-- timeStamp: string (nullable = true)
 |    |    |-- instanceId: string (nullable = true)
 |    |    |-- userId: string (nullable = true)
 |    |    |-- reason: string (nullable = true)
 |    |    |-- additionalData: map (nullable = true)
 |    |    |    |-- key: string
 |    |    |    |-- value: string (valueContainsNull = true)

Как удалить набор значений столбцов из DataFrame , не удаляя его из схемы в PySpark?Это отличается от удаления определенных столбцов из всей схемы.

Предположим, что столбцы, которые нужно сохранить, находятся в списке keepColumns.Я хотел бы заменить записи всех других столбцов на NULL, оставив при этом записи keepColumns без изменений.

Например,

keepColumns = ["C",
               "D.d1.zoneName",
               "E.e1.reason",
               "E.e2.timeStamp"]

Обратите внимание на вложенные поля Array и Struct.Я даже не смог бы использовать select для подполя типа ArrayType, если бы не использовал индекс, такой как select E.e2[0].timeStamp from table1 (после применения df.createOrReplaceTempView("table1")).

Следуя решению, получившему наибольшее количество голосов, указанному в этот пост тоже не работает.Это просто показывает отсутствие изменений в существующих значениях.

1 Ответ

0 голосов
/ 13 июня 2019

У меня была такая же проблема с вложенными структурными полями, где я хотел, чтобы они имели тип StringType, но были заполнены нулями.Я не смог заставить его сохранить тип, не используя сначала пустую строку.

Вот что мне сработало: использование UDF для пустой строки, так что Spark по-прежнему выводит StringType (слегка измените UDF):

    def nullify(col):
        return F.when(col == '', F.lit(None)).otherwise(col)


    # Does not work
    >>> df.select(F.struct(F.lit(None).alias('test'))).printSchema()
    root
     |-- named_struct(test, NULL AS `test`): struct (nullable = false)
     |    |-- test: null (nullable = true)

    # Works!
    >>> df.select(F.struct(nullify(F.lit('')).alias('test'))).printSchema()
    root
     |-- named_struct(test, nullify() AS `test`): struct (nullable = false)
     |    |-- test: string (nullable = true)

Просто обратите внимание, что я создаю свои структуры на лету, поэтому я применяю их, когда создаю их.Другая история, если вы уже читали в структуре - вам придется сгладить ее и перестроить заново в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...