在 Spark Scala 中解码 Base64

Posted

技术标签:

【中文标题】在 Spark Scala 中解码 Base64【英文标题】:Decoding Base64 in Spark Scala 【发布时间】:2022-01-17 21:08:48 【问题描述】:

我创建了以下 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 中,或者我该怎么做?

【问题讨论】:

【参考方案1】:

要检查该值是否为有效的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|
//+----------------+------------+

【讨论】:

这里有一个逻辑谬误。 Base64 是双射的,解码和编码总是根据设计产生输入。除非当然输入不能是base64(包含禁止字符,长度错误......)。你会抓住那些没事的。但是您不会发现纯文本和 base64 之间的冲突。例如,单词“together”是一个有效的 base64 字符串。它编码为 0xb6881eb617ab,解码为“一起”。现在几乎使它起作用的是,0xb6881eb617ab 是有效的 UTF(更不用说 ASCII)字节序列的可能性很低。然而,在我的书中,这是一个等待发生的错误。

以上是关于在 Spark Scala 中解码 Base64的主要内容,如果未能解决你的问题,请参考以下文章

怎么解决js解码base64中文乱码问题

通过python扩展spark mllib 算法包(e.g.基于spark使用孤立森林进行异常检测)

base64解码,不能解出中文怎么回事?能不能给个代码。。谢谢

base64编码与base64解码

如何解码base64 fbx嵌入图像

通过python扩展spark mllib 算法包(e.g.基于spark使用孤立森林进行异常检测)