从多个键值对中操纵Spark SQL中Map结构中键的单个值。将unbase64应用于单个值

时间:2019-12-26 06:14:01

标签: apache-spark

我对接收文件有一个要求,该文件有多列。一列数据类型是Map结构。其他是字符串。 在此Map结构中,每个记录有多个Key:value对。

地图数据的

Ex-

地图 (f-expaneded-port:451,

custNo : 415723, 

channel : netsite, 

y-ub-eg-en-author : "7Im5hbWUiOiJpbnRlcm5hbEFjY291bnRJZHMiLCJ2YWx1ZSI6WyIwNjIw16", /*This value is base64 */

sessionid : e5cdb71d3572dd6f7gh8jh6dssf8g688dda0, 

y-expandeded-proto : https) 

每个记录可能具有不同的键值对。

要求:-我们必须找到键“ y-ub-eg-en-author”,并使用Spark Sql对相应的Value应用unbase64()函数来解码该值。如果没有这样的密钥(y-ub-eg-en-author),则无济于事。

任何人都可以让我们知道可能的解决方案,如何在不影响其他键值对的情况下将unbase64函数应用于特定键值。

谢谢

1 个答案:

答案 0 :(得分:0)

尝试了以下选项,并且正在解决。请检查一下。

1)第一张地图已经爆炸。

2)根据关键条件应用了unbase64。

3)然后,再次将爆炸列更改为MAP。在主键列上分组。

val Query="""SELECT CAST(Id AS String) AS Primary_ID,key_index as key_index,case when key_index in ('x-insider-token','x-ent-auth') then CAST(unbase64( CAST(key_value AS STRING) ) AS STRING) else key_value end as value FROM kafka_avro_events LATERAL VIEW EXPLODE(map_value) as key_index, key_value """

val df1 = spark.sql(Query)

val result = df1.withColumn("map", map($"key_index", $"value")).groupBy("Primary_ID").agg(collect_list("map")).as[(String, Seq[Map[String, String]])].map { case (id, list) => (id, list.reduce(_ ++ _)) }.toDF("id", "gMap")

result.show(truncate = false)

+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|id     |gMap                                                                                                                                                                                                                |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
|corrId1|Map(f-expaneded-port -> 451, custNo -> 415723, channel -> netsite, y-ub-eg-en-author -> {"decision":"PERMIT","authorized":true} , sessionid -> e5cdb71d3572dd6f7gh8jh6dssf8g688dda0, y-expandeded-proto -> https    |
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+