Spark Scala: обнулить столбцы, сохраняя тот же тип данных столбца - PullRequest
0 голосов
/ 28 мая 2020

После чтения Dataframe мне нужно обнулить некоторые столбцы (Столбцы с информацией PII), но сохранить исходный столбец DataType.

Я пробовал это:

 implicit class DataFrameImplicits (dataFrame: DataFrame) {

     def withPIIColumnsNullified(piiCols : Seq[String]) : DataFrame = {

      piiCols.foldLeft(dataFrame) { (outputDf, piiCol) => {
          outputDf.withColumn(piiCol, it(null))
        }
      }
    }

 }

В моем logi c:

 val piiCols = //column list needs to be nullified
 var df = //read the datafrom HDFS

 df = df.withPIIColumnsNullified(piiCols)

Но указанный выше метод изменил исходный тип столбца на «нулевой тип», что сделало невозможным сохранение как Parquet.

Как сохранить исходный DataType при выполнении этого преобразования ?

1 Ответ

2 голосов
/ 28 мая 2020

Попробуйте код ниже.

Вы должны передать Seq[(String,String)] в withPIIColumnsNullified функцию.

Первая строка - column name, а вторая - column data type. Внутри вашей функции приведите этот столбец со значением второго параметра.

implicit class DataFrameImplicits (dataFrame: DataFrame) {
     def withPIIColumnsNullified(cols : Seq[(String,String)]) : DataFrame = {
      cols.foldLeft(dataFrame) { (outputDf, cols) => {
          outputDf.withColumn(cols._1, lit(null).cast(cols._2))
        }
      }
    }
 }

var df = //read the datafrom HDFS
val colsAndDt = df.schema.fields.map(d => (d.name,d.dataType.typeName)).toSeq

df = df.withPIIColumnsNullified(colsAndDt)


...