我有一个流式数据框,它从Kafka中读取消息。在启动writeStream之前,我想对一些列进行哈希处理,而对其他一些列进行屏蔽。对于不同的表,要散列或屏蔽的列将有所不同,因此我将其参数化。
我正在使用下面的代码来掩盖运行良好的所选列。
var maskColumnsconfig = "COL1, COL2" //Reading columns to mask from Config file or widget
var maskColumns = maskColumnsconfig.split(",")
def maskData(base: DataFrame, maskColumns: Seq[String]) = {
val maskExpr = base.columns.map { col => if(maskColumns.contains(col)) s"null as ${col}" else col }
base.selectExpr(maskExpr: _*) //masking columns as null
}
val maskedDF = maskData(myDataFrame,Seq(maskColumns:_*))
参考:- How to mask columns using Spark 2?
对于散列,我希望创建一个功能类似于以下内容:-
<罢工>
myDataFrame.withColumn("COL1_hashed",sha2($"COL1",256)).drop($"COL1").withColumnRenamed("COL1_Hashed", "COL1").withColumn("COL2_hashed",sha2($"COL2",256)).drop($"COL2").withColumnRenamed("COL2_Hashed", "COL2")
编辑:相反,我可以这样做:-
myDataFrame.withColumn("COL1",sha2($"COL1",256).withColumn("COL2,sha($"COL2",256)
即
<罢工>
1。添加哈希列,2.删除原始列,3.将哈希列重命名为原始列的名称
4.重复其他要散列的列
编辑: 1。用散列值替换列,2.重复其他要散列的列
关于如何使用可吸收多个列并对所有列执行上述操作的功能的任何建议/想法。我尝试创建如下所示的函数,但它给出了错误:
def hashData(base: DataFrame, hashColumns: Seq[String]) = {
val hashExpr = base.columns.map { col => if(hashColumns.contains(col)) base.withColumn({col},sha2({col},256)) else col }
base.selectExpr(hashExpr: _*)
}
command-3855877266331823:2: error: type mismatch;
found : String
required: org.apache.spark.sql.Column
val hashExpr = base.columns.map { col => if(hashColumns.contains(col)) base.withColumn({col},sha2({col},256)) else col }
编辑2:试图模仿类似于遮罩的功能,但也会产生错误。
def hashData(base: DataFrame, hashColumns: Seq[String]) = {
val hashExpr = base.columns.map { col => if(hashColumns.contains(col)) base.withColumn(col,sha2(base(col),256)) else col }
base.selectExpr(hashExpr: _*)
}
错误:-
found : Array[java.io.Serializable]
required: Array[_ <: String]
Note: java.io.Serializable >: String, but class Array is invariant in type T.
You may wish to investigate a wildcard type such as `_ >: String`. (SLS 3.2.10)
base.selectExpr(hashExpr: _*)
理想情况下,我想要一个函数同时执行哈希和掩码。对于实现这一目标的任何想法/线索,我将不胜感激。
scala:2.11 火花:2.4.4