sparkscala:取消保持相同列数据类型的列

rlcwz9us  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(342)

在读取dataframe之后,我需要清空一些列(包含pii信息的列),但保留原始的列数据类型。
我试过这个:

implicit class DataFrameImplicits (dataFrame: DataFrame) {

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

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

 }

按照我的逻辑:

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

 df = df.withPIIColumnsNullified(piiCols)

但上面的方法将原来的列类型更改为“null类型”,从而无法保存为parquet。
如何在进行转换时保留原始数据类型?

bybem2ql

bybem2ql1#

试试下面的代码。
你必须通过 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)

相关问题