在 Spark Scala 中解码 Base64

Decoding Base64 in Spark Scala

我创建了以下 DataFrame:

val data = spark.sparkContext.parallelize(Seq(("SnVsZXMgTmV3b25l"), ("Jason Kidd"), ("TXIgUm9uYWxkIE0=")))
val df_data = data.toDF()
val decoded_got = df_data.withColumn("xxx", unbase64(col("value")).cast("String"))

我得到以下信息:

+----------------+------------+
|name            |xxx         |
+----------------+------------+
|SnVsZXMgTmV3b25l|Jules Newone|
|Jason Kidd      |%�(���   |
|TXIgUm9uYWxkIE0=|Mr Ronald M |
+----------------+------------+

我想做的是避免列名的值不是 base 64。例如,得到以下 Df:

+----------------+------------+
|name            |xxx         |
+----------------+------------+
|SnVsZXMgTmV3b25l|Jules Newone|
|Jason Kidd      |Jason Kidd  |
|TXIgUm9uYWxkIE0=|Mr Ronald M |
+----------------+------------+

我正在尝试类似的方法,但对我不起作用:

val regex1 = """^([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?$"""
val check = df_data.withColumn("xxx", when(regex1 matches col("value"), unbase64(col("value"))).otherwise(col("value")))

Spark Scala 中是否有一个选项来检查该值是否在 base64 中,或者我该怎么做?

要检查该值是否为有效的base64编码字符串,您可以尝试对其进行解码并重新编码,您应该会得到初始值。如果不是,则它不是 base64 字符串:

val decoded_got = df_data.withColumn(
  "xxx",
  when(
    base64(unbase64(col("value"))) === col("value"),
    unbase64(col("value")).cast("string")
  ).otherwise(col("value"))
)

decoded_got.show
//+----------------+------------+
//|           value|         xxx|
//+----------------+------------+
//|SnVsZXMgTmV3b25l|Jules Newone|
//|      Jason Kidd|  Jason Kidd|
//|TXIgUm9uYWxkIE0=| Mr Ronald M|
//+----------------+------------+