【发布时间】:2018-03-02 02:04:11
【问题描述】:
我有一些表需要屏蔽其中的一些列。要屏蔽的列因表而异,我正在从application.conf 文件中读取这些列。
例如下图的员工表
+----+------+-----+---------+
| id | name | age | address |
+----+------+-----+---------+
| 1 | abcd | 21 | India |
+----+------+-----+---------+
| 2 | qazx | 42 | Germany |
+----+------+-----+---------+
如果我们想屏蔽姓名和年龄列,那么我会按顺序获取这些列。
val mask = Seq("name", "age")
屏蔽后的预期值为:
+----+----------------+----------------+---------+
| id | name | age | address |
+----+----------------+----------------+---------+
| 1 | *** Masked *** | *** Masked *** | India |
+----+----------------+----------------+---------+
| 2 | *** Masked *** | *** Masked *** | Germany |
+----+----------------+----------------+---------+
如果我有员工表一个数据框,那么屏蔽这些列的方法是什么?
如果我有如下所示的payment 表并且想要屏蔽name 和salary 列,那么我将序列中的屏蔽列设为
+----+------+--------+----------+
| id | name | salary | tax_code |
+----+------+--------+----------+
| 1 | abcd | 12345 | KT10 |
+----+------+--------+----------+
| 2 | qazx | 98765 | AD12d |
+----+------+--------+----------+
val mask = Seq("name", "salary")
我尝试了类似 mask.foreach(c => base.withColumn(c, regexp_replace(col(c), "^.*?$", "*** Masked ***" ) ) ) 的操作,但没有返回任何内容。
感谢@philantrovert,我找到了解决方案。这是我使用的解决方案:
def maskData(base: DataFrame, maskColumns: Seq[String]) = {
val maskExpr = base.columns.map { col => if(maskColumns.contains(col)) s"'*** Masked ***' as ${col}" else col }
base.selectExpr(maskExpr: _*)
}
【问题讨论】:
标签: scala apache-spark apache-spark-sql apache-spark-2.0